2016-10-10 48 views
0

我閱讀了文章「http://www.ibm.com/developerworks/java/library/j-jtp10264/」。他們提到「鎖定框架是兼容的替代品」。我明白,通過使用Reentrant鎖,我們可以在方法中保持鎖定,等待鎖定一段時間(使用同步塊(或)方法是不可能的)。我的疑問是,是否有可能用帶有重入鎖的同步機制來替換應用程序?是可重入鎖是否完全替換同步?

例如,我想實現一個線程安全堆棧數據結構,其中所有push,pop,getTop方法都是同步的,所以在多線程環境中,一次只有一個線程可以訪問一個synchronized方法如果一個線程使用push方法,則其他線程無法訪問push,pop,getTop(或)Stack類的任何其他同步方法)。使用Reentrant鎖可以實現相同的線程安全堆棧數據結構嗎?如果可能,請提供一個例子來理解這一點。

+2

有,因爲Java 5的許多替代'synchronized'聲明,不僅是'鎖'。在你的情況下,你可能想利用'java.util.concurrent'包中的synchronized集合,而不是重新發明輪子。 – Mena

+0

亞..我知道併發收集,但我的問題是,是否有可能使用鎖定框架實現完整的線程安全數據結構。 –

+0

你無法用'Lock's做的一件事,但你可以用'synchronized'來做,它是通過池中的對象來濫用它的。總的來說可能不是一件壞事。 – biziclop

回答

2

答案是「是」。

lock - unlock對使用​​,而不是synchronize() { ... }awaitsignal in Condition代替waitnotify

3

任何你可以用​​做的事,你也可以用ReentrantLock做,但反之亦然。話雖如此,如果你需要的是lock/unlock語義,我建議​​,因爲它在我看來更具可讀性。

0

布賴恩戈茨章中討論了13.4這"Java Concurrency in Practice"

ReentrantLock對於其中的內在鎖是不實際的情況下,一個先進的工具。如果您需要高級功能,請使用它:定時,輪詢或可中斷的鎖獲取,公平排隊或非塊結構鎖定。否則,更喜歡同步。

我絕對同意,因爲恕我直言,這樣的:

synchronized (lock) { 
    // ... 
} 

是遠遠更具可讀性和錯誤比這個容易出現少:

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

長話短說:從技術角度來看,是的,你可以用ReentrantLock代替​​,但我不會這樣做。

也會檢出這些問題:

0

ReentrantLock是替代同步之一。

可重入互斥鎖具有與使用同步方法和語句訪問的隱式監視器鎖相同的基本行爲和語義,但具有擴展功能。

參考這個問題的其他辦法,以同步(併發集合,原子變量,執行人,ThreadLocal的變量)

Avoid synchronized(this) in Java?