[英]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.