在最新一期的“德国Java杂志”中,有一个代码示例ReentrantReadWriteLock
(我猜ReadWriteLock
一般)经常被错误地使用。不幸的是,作者并不在意解释原因。
private static final ReadWriteLock lock = new ReentrantReadWriteLock();
// #1: correct use
lock.writeLock().lock();
try {
// do stuff
} finally {
lock.writeLock().unlock();
}
// #2: incorrect use
try {
lock.writeLock().lock();
// do stuff
} finally {
lock.writeLock().unlock();
}
// #3: incorrect use
lock.writeLock().lock();
// do stuff
lock.writeLock().unlock();
我明白为什么#3错了。 但是#1和#2之间的差异是什么?假设lock.writeLock().lock();
没有抛出(编辑:错误的假设,请参阅接受的答案),这些版本看起来等于我。
答案 0 :(得分:5)
实施注意事项
Lock实现可能能够检测到锁的错误使用, 例如一个会导致死锁的调用,可能会抛出一个 在这种情况下(未经检查)例外。情况和 异常类型必须由Lock实现记录。
强调我的。
因此,通过合同,它可以抛出Exception
。这就解释了为什么第二种方法是错误的。