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)
如果锁定失败,你会不必要地抛出两个例外; 其中一个将丢失.
更不用说取决于锁的实现,使用第二个版本你可能最终解锁"别人"的锁......不是一件好事.
不同之处在于如果l为null 则会发生什么:
第一个示例将失败,异常指向try块上方的第一行.
第二个示例将失败,NPE会被finally块中抛出的另一个NPE屏蔽掉.
此外,如果锁定失败,第二个示例中的finally块可能会尝试解锁未锁定的锁定,而第一个示例则不会.