synchronized和Lock有什麼區別

1、原始構成

synchronized是關鍵字屬於JVM層面,monitorenter(底層是通過monitor對象來完成,其實wait/notify等方法也依賴於monitor對象),monitorexit。

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

2、使用方法

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

ReentrantLock需要用戶手動釋放鎖。需要lock()和unlock()方法配合try/finally語句來完成。

3、等待是否可中斷

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

ReentrantLock可中斷,設置超時方法tryLock(long timeout,TimeUnit unit)或者lockInterruptibly()放代碼塊中,調用interrupt()方法可中斷。

4、加鎖是否公平

synchronized非公平鎖。

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

5、鎖綁定多個條件Condition

synchronized沒有。

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

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