以下内容有什么不同:
private Lock lock = new ReentrantLock(true);
public void getIn (int direction) throws InterruptedException {
lock.lock();
try {
...和
...
public void getIn (int direction) throws InterruptedException {
try {
lock.lock();
...编译过程很顺利,程序也能正常工作(我指的是相同的输出)
我应该把lock.lock();放在尝试之前还是之后?
谢谢你的帮助
发布于 2012-06-03 14:53:22
假设lock是一个ReentrantLock,那么它没有什么实际的区别,因为lock()不会抛出任何检查过的异常。
然而,Java文档在ReentrantLock示例中的try块之外留下了lock()。这样做的原因是,lock()中未检查的异常不应导致错误地调用unlock()。在lock()中存在未检查的异常的情况下,正确性是否值得关注,这完全是另一种讨论。
一般来说,尽可能保持try块的细粒度是一个很好的编码实践。
发布于 2012-06-03 15:05:26
如果是第一种情况,在finally中你可以直接说unlock()。如果是No2,你需要在unlock()之前检查你是否持有锁,否则你会得到IllegalMonitorStateException
发布于 2012-06-03 14:56:29
try语句还包含:
} finally {
lock.unlock();
}也就是说,如果您将lock.lock()放在try之后,lock.lock()抛出的异常将导致lock.unlock(),这是错误的,因为没有获得锁,解锁将导致另一个异常。所以第一个变种是正确的。要处理lock.lock()抛出的异常,必须使用另一个try语句。
https://stackoverflow.com/questions/10868423
复制相似问题