tryLock方法调用是否在try块中?

时间:2013-06-14 22:47:45

标签: java locking

ReentrantReadWriteLock.ReadLock
ReentrantReadWriteLock.WriteLock

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

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

OR

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

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

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

2 个答案:

答案 0 :(得分:4)

它必须进入条件部分,如果你没有获得锁定,就不能尝试使用数据。

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

         [...]
    } finally {
         readLock.unlock();
    }
} else {
    // failed to get lock
}

答案 1 :(得分:2)

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

javadoc for Lock说:

  

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

如果您尝试锁定try区块,则可能会遇到“双重问题”,即try中的一个例外和finally中的另一个例外锁将首先锁定失败...

这实际上意味着您必须.lock()通常在try块前面{}}}

lock.lock();
try {
    something();
} finally {
    lock.unlock();
}