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

ata*_*man 4 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(); 
Run Code Online (Sandbox Code Playgroud)

我明白了为什么#3是错的。但是#1和#2之间有什么区别?假设lock.writeLock().lock();没有抛出异常(编辑:错误的假设,请参见接受的答案),这些版本与我相同。

Bor*_*der 5

看看JavadocLock.lock()

实施注意事项

锁实现可能能够检测到锁的错误使用,例如可能导致死锁的调用,并且在这种情况下可能引发(未经检查的)异常。该Lock实现必须记录情况和异常类型。

强调我的。

因此,根据合同,它被允许扔一个Exception。这就解释了为什么第二种方法是错误的。