Java锁定结构最佳模式


问题内容

从技术角度来看,这两个列表之间有什么区别?首先是lock的
java doc中提供的一个。其次是我的。

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();
     }

问题答案:

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

实施注意事项

锁实现通常会限制哪些线程可以释放锁(通常只有锁的持有者才能释放该锁), 并且如果违反该限制,则可能引发(未经检查的)异常
。任何限制和异常类型都必须由那个Lock实现记录下来。

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

这意味着:

l.lock();
try {
    ...
} finally {
    l.unlock();
}

如果 锁定 失败,您将永远无法进入unlock()。而在:

try {
    l.lock();
    ...
} finally {
    lock.unlock();
}

如果锁定失败,则不必要地引发两个异常;而其中之一将丢失。

更不用说,取决于锁的 实现 方式,在第二个版本中,您可能最终会解锁“别人”的锁……这不是一件好事。