在下面的代码片段中,我不确定在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。
答案 0 :(得分:3)
由于您尚未成功锁定锁定,因此您不应将其解锁。