【问题标题】:Does the tryLock method call go in the try block?tryLock 方法调用是否在 try 块中?
【发布时间】:2013-06-14 22:47:45
【问题描述】:
ReentrantReadWriteLock.ReadLock
ReentrantReadWriteLock.WriteLock

对于上面的两个类,我是不是这样叫锁

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

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

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

lock() 方法与 tryLock() 方法哪个更安全?

【问题讨论】:

标签: java locking


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    javadoc for Lock 说:

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

    如果你尝试锁定try 块,你可能会陷入“双重麻烦”的境地,在try 中抛出一个异常,在finally 中抛出另一个异常,因为锁定将失败首先锁定...

    这实质上意味着您还必须将.lock() 通常放在try 块的前面,原因如下:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 2010-10-05
      相关资源
      最近更新 更多