synchronized 和 Lock 有什麼區別?用新的lock有什麼好處?

原始構成

synchronized 是關鍵字屬於JVM層面,monitorenter、monitorexit 底層是通過Monitor對象來完成,其實wait/notify等方法也依賴於Monitor對象,只有在同步塊或方法中才能調用wait/notify等方法。
Lock 是具體類(java.util.concurrent.locks.Lock),是API層面的鎖。

使用方法

synchronized 不需要用戶去手動釋放鎖,當synchronized代碼執行完後,系統會自動讓線程釋放對鎖對佔用。
ReentrantLock 則需要用戶去手動釋放鎖,若沒有主動釋放鎖就有可能出現死鎖現象。需要lock和unlock 方法配合try/finally 語句塊來完成。

等待是否可中斷

synchronized 不可中斷,除非拋出異常或者正常運行完成。
ReentrantLock 可中斷,方式一設置超時方法tryLock(long timeout, TimeUnit unit),方式二lockInterruptibly()放代碼塊中,調用interrupt方法可中斷。

加鎖是否公平

synchronized 非公平鎖。
ReentrantLock 兩者都可以,默認是非公平鎖,構造方法可以傳boolean值,true爲公平鎖,false爲非公平鎖。

鎖綁定多個條件condition

synchronized 沒有。
ReentrantLock 用來實現分組喚醒需要喚醒的線程們,可以精確喚醒,而不是像synchronized 要麼用notify方法隨機喚醒一個線程要麼用notifyAll方法喚醒全部線程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章