2013-05-27 82 views
5

正在使用鎖(java.util.concurrent.locks.Lock)而不是關鍵字​​方法wait()和方法notify()完全一樣嗎?顯式鎖vs隱式鎖

我可以線程安全程序中使用鎖(鎖明確),而不是隱鎖(​​)?

由於知道的我一直使用隱式鎖。我知道由像方法Lock接口實現給出的優點:isLocked()getLockQueueLength()getHoldCount(),等等...但還是老派的方式(wait()notify())將有比沒有這些方法以外的其他限制?

我也知道的建設有一個(布爾公平)參數,允許缺乏飢餓的鎖的可能性。

+1

好吧,它不是*完全相同,就好像它們在100%相同的情況下一樣,那麼其中一個的存在將是多餘的;-) –

+1

@Joachim Sauer當然,這不是編程語言第一次有兩個相同的做同樣事情的方法。 – Patashu

+1

@Patashu:當然不是。但是如果沒有至少一些優點(比如'isLocked()'方法,...),他們不太可能在第一個選項後面添加第二個選項。 –

回答

7

是的,絕對可以寫使用java.util.concurrent.locks.Lock線程安全的程序。如果看到java.util.concurrent.locks.Lock的任何實現,如ReentrantLock,則內部實現將使用舊的​​塊。

門鎖實現提供了比使用同步方法和語句可獲得的更廣泛的鎖定操作。它們允許更靈活的結構化,可能具有完全不同的屬性,並且可以支持多個關聯的Condition對象。

添加到我的差值​​關鍵詞自然而然地建立在語言支持。這可能意味着JIT可以以與Locks不能一致的方式優化synchronised blocks。例如它可以結合synchronized blocks同步最好爲少數訪問鎖的線程和Lock可能是最適合大量訪問相同的鎖的線程。另外​​塊使沒有保證關於等待輸入它的線程被授予訪問的順序。

2

鎖和​​塊具有相同的語義和從Java內存模型透視提供相同的保證。主要區別在於Locks提供更多的控制(例如tryLock或者要求鎖定公平等),這允許更靈活和更細緻的鎖管理。

然而,當你不需要這些額外的功能,最好是使用一個普通的老​​塊,因爲它降低了錯誤的餘地(例如,你不能「忘記」 unlock它)。