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();
}
如果锁定失败,则不必要地引发两个异常;而其中之一将丢失。
更不用说,取决于锁的 实现 方式,在第二个版本中,您可能最终会解锁“别人”的锁……这不是一件好事。