Java锁定结构最佳模式
这两个列表的技术角度有什么不同? 首先是java doc of lock中提供的一个。 第二是我的。
1。
Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); }
2。
Lock l = ...; try { l.lock(); // access the resource protected by this lock } finally { l.unlock(); }
原因是在Lock
的.unlock()
文档的javadoc中找到:
实施注意事项
Lock实现通常会对哪个线程释放锁定(通常只有锁的持有者可以释放它)施加限制,并且如果违反了限制,则可能抛出(未经检查的)exception 。 Lock实现必须记录任何限制和exception类型。
同样, .lock()
可能会因未经检查的exception而失败。
这意味着:
l.lock(); try { ... } finally { l.unlock(); }
如果锁定失败,你永远不会unlock()
。 而在:
try { l.lock(); ... } finally { lock.unlock(); }
如果锁定失败,你会不必要地抛出两个exception; 其中一个将丢失。
更不用说取决于锁的实现 ,第二个版本你可能最终解锁“别人”的锁…不是一件好事。
不同之处在于,如果l
为null,会发生什么:
-
第一个示例将失败,exception指向try块上方的第一行。
-
第二个示例将失败,NPE会被finally块中抛出的另一个NPE屏蔽掉。
此外,如果锁定失败,第二个示例中的finally块可能会尝试解锁未锁定的锁定,而第一个示例则不会。