2014-02-20 21 views
2

在下面的代碼片段,我不知道是否設置鎖定爲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。

+5

'locked = false;'在catch塊中是多餘的。 – assylias

+0

看我的編輯,其中鎖定已達到,但線程中斷。 –

+0

如果包含在線程中斷情況下拋出InterruptedException的Edit2中的代碼,則在catch塊中設置locked = false將是一個非常糟糕的主意。 –

回答

3

由於您尚未成功鎖定鎖定,因此您不應將其解鎖。

+0

這似乎是正確的。我在想,如果線程在獲得鎖之後中斷,那麼將會發生InterruptedException。但情況並非如此。 –

相關問題