2013-02-16 48 views
1

比方說,我有一個ReentrantLock如何正確範圍鎖定

ReentrantLock foo = new ReentrantLock(); 

和使用該鎖的方法bar

public void bar() 
{ 
    foo.lock(); 

    try 
    { 
     methodOne(); 
    } 
    finally 
    { 
     foo.unlock(); 
    } 
} 

methodOne調用方法methodTwo同樣使用該鎖,

public void methodTwo() 
{ 
    foo.lock(); 

    try 
    { 
     // do something 
    } 
    finally 
    { 
     foo.unlock(); 
    } 
} 

是否更好釋放th在撥打電話methodOne之前,請鎖上bar?一般來說,在調用另一種方法之前釋放鎖是否是一種好的做法?

回答

3

不,你不應該那樣做。如果這樣做,任何併發線程都可以在bar()方法的中間獲取鎖,這正是您想要通過使用鎖避免的情況。

它被稱爲ReentrantLock正是因爲它允許在同一個線程中多次獲取鎖。計數器每次調用lock()時都會遞增,並且每次調用unlock()時都會減1,所以您只需確保總是在finally塊中調用unlock()

請注意,通過簡單地使用同步塊,代碼將不太脆弱,因爲不可能忘記關閉同步塊。

2

當鎖「保護」的關鍵操作完成時釋放鎖。不早於。