ITPub博客

首页 > 应用开发 > > Java面试题之lock、tryLock和finally

Java面试题之lock、tryLock和finally

作者:wyvernw 时间:2019-10-09 10:23:34 0 删除 编辑

面试题目如下,关于lock、tryLock和finally 的理解。

针对上述每一个选项,我们逐一分析一下。

(1)从JDK 源码来看,lock 的确是非公平锁。

默认创建非公平锁,可以传入参数 true 创建公平锁。

试题中并没有传入参数,因此lock 是非公平锁。

(2)查看 finally 代码块中的 lock.unlock() 源码

如下JDK源码所示,lock.unlock() 存在抛出异常的情况。

比如,在没有lock() 成功的情况下,也就是当前线程没有获取到锁的情况下,调用unlock() 方法时,就会抛出异常。

正常的代码逻辑如下所示。

lock() 方法的调用在try 语句块之外,并且在lock() 方法和try 语句之间,不要加任何代码,避免抛出异常,导致 unlock() 方法没有执行到,锁无法释放。

(3)tryLock() 方法

Lock接口提供了另一种方法来获取锁,即tryLock()方法。跟lock()方法最大的不同是:线程使用tryLock()不能获取锁,tryLock()会立即返回,它不会将线程置入休眠。tryLock()方法返回一个布尔值,true表示线程获取了锁,false表示没有获取锁。

tryLock() 方法无论如何都会立即返回,在拿不到锁时不会一直在那等待。

正常的代码逻辑,是对 lock.tryLock() 方法的返回值进行判断,根据返回值不同,执行不同的逻辑,避免获取锁失败的情况下,仍然进行正常的业务逻辑处理。

if (lock.tryLock()) {

System.out.println(tName + "获取到锁!");

} else {

System.out.println(tName + "获取不到锁!");

return;

综上所述,因此本面试题的正确选项是:B(因为 finally 语句块中的 lock.unlock() 方法存在抛出异常的可能性)。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/835/viewspace-3144904/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: Mybatis查询报错
请登录后发表评论 登录
全部评论

注册时间:2019-04-12

  • 博文量
    128
  • 访问量
    1296