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块可能会尝试解锁未锁定的锁定,而第一个示例则不会。