2011-09-16 27 views

回答

3

一個可重複鎖定是相同的線程可能獲取不止一次。通常,重入鎖必須被解鎖的次數與鎖定的次數相同。再入式鎖通常更容易編碼。如果你有幾種方法讓A調用B和B調用C ...但是這個代碼的客戶端可以調用A或B或C,並且如果你想在這些方法中鎖定,那麼一個可重入的鎖將解決你的問題問題。它會一次阻止除了一個線程以外的任何線程訪問此代碼,但它將允許多次鎖定採集,因此您不會死鎖自己。

比方說,你有這樣的:

public class SyncTest { 
    private final Lock lock = new ReentrantLock(); 
    public void doA() { 
    lock.lock(); 
    try { 
     doB(); 
     doSomethingForA(); 
    } finally { 
     lock.unlock(); 
    } 
    } 

    public void doB() { 
    lock.lock(); 
    try { 
     doC(); 
     doSomethingForB(); 
    } finally { 
     lock.unlock(); 
    } 
    } 

    public void doC() { 
    lock.lock(); 
    try { 
     doSomeWorkThatEveryoneDoes(); 
    } finally { 
     lock.unlock(); 
    } 
    } 
} 

,而其他的代碼可以調用任何doAdoBdoC和所有的人,周圍用相同的鎖定一些工作同步。使用的鎖是「可重入的」,因爲同一個線程可以多次獲取它。如果鎖不可重入,那麼當您撥打doA時,當您輸入doB並嘗試獲取該鎖時,即使該鎖恰好屬於您自己,您也會死鎖,因爲鎖已經擁有。

例如,初始化爲一個計數的純計數信號量是非重入鎖。如果同一個線程試圖獲得它兩次,它會永遠阻止一種自我僵局。