在Java中,是否有必要在InterruptedException之后调用unlock,或者应该解锁?

时间:2014-02-20 16:34:55

标签: java locking mutex

在下面的代码片段中,我不确定在InterruptedException之后是否将locked设置为false:

private static Lock lock = new ReentrantLock(true);

void foo() {
    final long timeout = 30;
    boolean locked = false;
    try {
        locked = lock.tryLock(timeout, TimeUnit.SECONDS);
        // Do time consuming work that might be interrupted
        // ...
        // ...
    } catch (InterruptedException e1) {
        locked = false;  // Is this correct????
    } finally {
        if( locked) {
            lock.unlock();
        }
    }
}

编辑:我从原始示例中省略了“可能被中断的耗时工作”,所以看起来我在询问tryLock的用法,而不是在线程中断的情况下会发生什么。那么如果授予锁定,那么线程就会中断。这会自动释放锁定,还是必须在finally子句中发生?

Edit2:我似乎误解了Java中的线程中断。如果在此主题上调用Thread.interrupt(),则Thread.interrupted()将为真,而不是InterruptedException被引发,除非包含以下代码:

if (Thread.interrupted()) {
    throw new InterruptedException();
} 

这会引起我所担心的模糊的InterruptedException。所以看起来这里的教训是,如果你正在使用trylock(超时),那么不要抛出InterruptedException。

1 个答案:

答案 0 :(得分:3)

由于您尚未成功锁定锁定,因此您不应将其解锁。