Java多線程之Synchronized和Lock的差別
目錄:
- 原始構成
- 使用方法
- 等待是否可以中斷
- 加鎖是否公平
- 鎖綁定多個條件Condition
- 小結:Lock相比較Synchronized的優點
1. 原始構成
- synchronized是關鍵字屬于JVM層面,
- 進入:monitorenter(底層是通過monitor對象來完成,其實wait/notify等方法也依賴于monitor對象,隻有在同步塊或者方法中才能調用wait/notify)
- 退出:monitorexit
- 如下圖所示
Java多線程之Synchronized和Lock的差別Java多線程之Synchronized和Lock的差別
- 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要麼随機喚醒一個線程要麼全部喚醒線程。
6. 小結:Lock相比較Synchronized的優點
- ReentrantLock可中斷線程
- ReentrantLock可以精确喚醒線程