3
ReentrantReadWriteLock.ReadLock
ReentrantReadWriteLock.WriteLock

对于上述两个类,我是否像这样调用 lock

try {
     readLock.tryLock(10, TimeUnit.SECONDS)
     [...]
} finally {
     readLock.unlock();
}

或者

readLock.tryLock(10, TimeUnit.SECONDS)
try {

     [...]
} finally {
     readLock.unlock();
}

哪个更安全,同样适用于lock()方法与tryLock()方法?

4

2 回答 2

5

它必须进入条件部分,如果您未能获得锁定,您将无法尝试使用数据。

if (readLock.tryLock(10, TimeUnit.SECONDS)) {
    try {

         [...]
    } finally {
         readLock.unlock();
    }
} else {
    // failed to get lock
}
于 2013-06-14T22:50:49.523 回答
2

@PeterLawrey 说了什么,但还有更重要的。

javadocLock说:

Lock 实现可能能够检测到锁的错误使用,例如会导致死锁的调用,并且在这种情况下可能会抛出(未经检查的)异常。

如果您尝试锁定该try块,您可能最终会陷入“双重麻烦”的情况,您会在其中抛出一个异常try和另一个异常finally,因为锁一开始就无法锁定......

这实质上意味着您通常也必须因为这个原因.lock()在块前面:try

lock.lock();
try {
    something();
} finally {
    lock.unlock();
}
于 2013-06-14T22:53:12.103 回答