Synchronized和Lock有什麼區別

1.原始構成

synchronized是關鍵字屬於JVM層面

     monitorenter(底層是通過monitor對象來完成,其實wait/nitofy等方法也依賴monitor對象,只有在同步塊或同步方法中才能使用這兩個方法)

     monitorexit

Lock是具體類(java.util.concurrent.locks.lock)api層面的鎖

synchronized

 

 2.使用方法

synchronized不需要用戶去手動釋放鎖,當synchronized代碼執行完成系統會自動讓線程釋放對鎖的佔用,

ReentrantLock則需要用戶手動釋放鎖,若沒有釋放鎖,則有可能導致出現死鎖現象。需要Lock和Unlock方法配合try/finally語句塊來完成。

 

3.等待是否中斷

synchronized不可中斷,除非拋出異常或者程序正常運行完成

ReentrantLock 可中斷,1 設置超時方法 tryLock(long timeout,TimeUnit unit)

                                           2 lockInterruptibly()放代碼塊中,調用interrupt()可中斷

 

4.加鎖是否公平

 synchronized 非公平鎖

ReentrantLock 兩者都可以,默認爲非公平鎖,構造方法可以傳入boolean值,ture爲公平鎖,false爲非公平鎖

 

5.鎖綁定多個條件condition

 synchronized沒有

ReentrantLock用來實現分組喚醒需要喚醒的線程們,可以精確喚醒,而不像synchronized那樣隨機喚醒一個或者全部喚醒

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