原因可以在以下
.unlock()文档的javadoc中
Lock找到:
实施注意事项
锁实现通常会限制哪些线程可以释放锁(通常只有锁的持有者才能释放该锁), 并且如果违反该限制,则可能引发(未经检查的)异常
。任何限制和异常类型都必须由那个Lock实现记录下来。
同样,a
.lock()可能会因未检查的异常而失败。
这意味着:
l.lock();try { ...} finally { l.unlock();}如果 锁定 失败,您将永远无法进入
unlock()。而在:
try { l.lock(); ...} finally { lock.unlock();}如果锁定失败,则不必要地引发两个异常;而其中之一将丢失。
更不用说,取决于锁的 实现 方式,在第二个版本中,您可能最终会解锁“别人”的锁……这不是一件好事。



