Java锁定结构最佳模式

RMa*_*nik 7 java multithreading

这两个列表的技术角度有什么不同?首先是java doc of lock中提供的一个.第二是我的.

1.

 Lock l = ...;
         l.lock();
         try {
             // access the resource protected by this lock
         } finally {
             l.unlock();
         }
Run Code Online (Sandbox Code Playgroud)

2.

Lock l = ...;

     try {
         l.lock();
         // access the resource protected by this lock
     } finally {
         l.unlock();
     }
Run Code Online (Sandbox Code Playgroud)

fge*_*fge 12

原因可以在以下.unlock()文档的javadoc中Lock找到:

实施注意事项

Lock实现通常会对哪个线程释放锁定(通常只有锁的持有者可以释放它)施加限制,并且如果违反了限制,则可能抛出(未经检查的)异常.Lock实现必须记录任何限制和异常类型.

同样,a .lock()可能会因未经检查的异常而失败.

这意味着:

l.lock();
try {
    ...
} finally {
    l.unlock();
}
Run Code Online (Sandbox Code Playgroud)

如果锁定失败,你永远不会去unlock().在:

try {
    l.lock();
    ...
} finally {
    lock.unlock();
}
Run Code Online (Sandbox Code Playgroud)

如果锁定失败,你会不必要地抛出两个例外; 其中一个将丢失.

更不用说取决于锁的实现,使用第二个版本你可能最终解锁"别人"的锁......不是一件好事.

  • 为了澄清,只有`lock`ing线程可以'解锁'.Assylias的注释会导致`IllegalMonitorStateException`. (2认同)

Nat*_*hes 5

不同之处在于如果l为null 则会发生什么:

  • 第一个示例将失败,异常指向try块上方的第一行.

  • 第二个示例将失败,NPE会被finally块中抛出的另一个NPE屏蔽掉.

此外,如果锁定失败,第二个示例中的finally块可能会尝试解锁未锁定的锁定,而第一个示例则不会.