簡體   English   中英

顯式鎖定與隱式鎖定

[英]Explicit Locks vs Implicit Locks

是使用Locks( java.util.concurrent.locks.Lock )而不是關鍵字synchronized +方法wait()和方法notify()完全一樣嗎?

我可以使用鎖(顯式鎖)而不是隱式鎖( synchronized )來線程安全地編程嗎?

據我所知,我一直在使用隱式鎖。 我知道Lock接口實現給出的優點,比如方法: isLocked()getLockQueueLength()getHoldCount()等...但是仍舊舊學校方式( wait()notify() )會有其他限制除了沒有這些方法?

我也知道用(布爾公平)參數構造一個鎖的可能性,它允許缺乏飢餓。

是的,絕對可以使用java.util.concurrent.locks.Lock編寫線程安全的程序。 如果你看到任何java.util.concurrent.locks.Lock實現,就像ReentrantLock一樣,內部實現使用舊的synchronized塊。

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

除了我的差異, synchronized關鍵字自然內置了語言支持。 這可能意味着JIT可以以Locks無法實現的方式優化synchronised blocks 例如,它可以組合synchronized blocks synchronized最適合訪問鎖的少量線程,而Lock可能最適合訪問相同鎖的大量線程。 synchronized也不保證等待進入它的線程被授予訪問權限的順序。

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

但是,當您不需要這些附加功能時,最好使用普通的舊synchronized塊,因為它可以減少出錯的空間(例如,您不能“忘記” unlock它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM