2011-08-25 31 views
1

在下面如果異常發生在syncMethod2()那麼我該如何解鎖鎖對象?如何在解鎖之前發生異常時解鎖ReentrantLock對象

public class ReEntrantLock { 
ReentrantLock lock = new ReentrantLock(); 

void syncMethod1() { 
    lock.lock(); 
    syncMethod2(); // throw new NullPointerException(); 
    lock.unlock(); 
} 

} 
+3

順便說一句:我建議你選擇你的測試類不同的名稱,如類似的名稱(或者更糟:相同的名字),你正在處理就會變得更加複雜和產生意想不到的效果的類。將「測試」附加到名稱通常足以使其更安全。 –

回答

2

您使用try - finally

lock.lock(); 
try { 
    syncMethod2(); // throw new NullPointerException(); 
} finally { 
    lock.unlock(); 
} 

這種模式在the ReentrantLock JavaDoc也有描述。

6
public class ReEntrantLock { 
    ReentrantLock lock = new ReentrantLock(); 

    void syncMethod1() { 
     lock.lock(); 
     try { 
      syncMethod2(); 
     } finally { 
      lock.unlock(); 
     } 
    } 

} 

這是正確的,在該documentation ...

+1

對於RTFM *鏈接*爲+1。 – Raedwald