2011-04-15 50 views
9

在布賴恩戈茨的書,Java併發在實踐中,他重入鎖的例子程序是這樣的:是否使可重入鎖定靜態並使其成爲互斥鎖?

Lock lock = new ReentrantLock(); 

不過,我很想知道,如果改變上述代碼:

private static final Lock lock = new ReentrantLock(); 

導致鎖現在充當互斥鎖,或者如果它不必要和冗餘。

因此,如果將鎖設爲私有,靜態和最終,此代碼的功能是否會發生變化?

lock.lock(); 
try { 
    //method stuff 
} finally { 
    lock.unlock(); 
} 

謝謝大家提前。 Matt

回答

18

是的。

finalprivate當然沒有影響,但static意味着所有實例共享相同的鎖。

所以如果你有兩個實例,代碼塊不能同時被兩個線程執行。

如果該鎖不是靜態的,則每個實例都會獲得自己的鎖。這意味着更多的線程可以同時運行代碼(當然,取決於它們的工作方式)。

+0

完美。謝謝。 – 2011-04-15 15:23:56

+1

有關鎖與synchronized關鍵字相關的更多信息,另請參見http://www.ibm.com/developerworks/java/library/j-jtp10264/。 – 2011-07-26 15:26:55

3

創建靜態鎖被equivallent到

synchronized(MyClass.class){ 

} 

它在本質上是一流水平鎖定