在catch块中调用ReentrantReadWriteLock#lock()是错误的吗?

时间:2014-03-22 22:57:10

标签: java concurrency locking java.util.concurrent

在最新一期的“德国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();没有抛出(编辑:错误的假设,请参阅接受的答案),这些版本看起来等于我。

1 个答案:

答案 0 :(得分:5)

查看Javadoc for Lock.lock()

  

实施注意事项

     

Lock实现可能能够检测到锁的错误使用,   例如一个会导致死锁的调用,可能会抛出一个   在这种情况下(未经检查)例外。情况和   异常类型必须由Lock实现记录。

强调我的。

因此,通过合同,它可以抛出Exception。这就解释了为什么第二种方法是错误的。