在下面的代碼片段,我不知道是否設置鎖定爲false InterruptedException的後:在Java中,是否有必要在發生InterruptedException之後調用解鎖,或者應該避免解除鎖定?
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(timeout),那麼不要拋出InterruptedException。
'locked = false;'在catch塊中是多餘的。 – assylias
看我的編輯,其中鎖定已達到,但線程中斷。 –
如果包含在線程中斷情況下拋出InterruptedException的Edit2中的代碼,則在catch塊中設置locked = false將是一個非常糟糕的主意。 –