天天看點

Java多線程之Synchronized和Lock的差別Java多線程之Synchronized和Lock的差別

Java多線程之Synchronized和Lock的差別

目錄:

  1. 原始構成
  2. 使用方法
  3. 等待是否可以中斷
  4. 加鎖是否公平
  5. 鎖綁定多個條件Condition
  6. 小結:Lock相比較Synchronized的優點

1. 原始構成

  1. synchronized是關鍵字屬于JVM層面,
    • 進入:monitorenter(底層是通過monitor對象來完成,其實wait/notify等方法也依賴于monitor對象,隻有在同步塊或者方法中才能調用wait/notify)
    • 退出:monitorexit
    • 如下圖所示
      Java多線程之Synchronized和Lock的差別Java多線程之Synchronized和Lock的差別
  2. Lock是具體類(java.util.concurrent.locks.Lock)是api層面的鎖

2. 使用方法

  1. synchronized不需要使用者去手動釋放鎖,當synchronized代碼執行完成後系統會自動讓線程釋放對鎖的占用。
  2. ReentrantLock則需要使用者去手動釋放鎖若沒有主動釋放鎖,就有可能導緻出現死鎖現在。需要lock()和unlock()方法配合try/finally語句塊來完成。

3. 等待是否可以中斷

  1. synchronized不可中斷,除非抛出異常或者正常運作完成。
  2. ReentrantLock可中斷
    1. 設定逾時時間方法tryLock(Long timeout, TimeUnit unit)
    2. lockInterruptibly()放代碼塊中,調用interrupt()方法可中斷

4. 加鎖是否公平

  1. synchronized非公平鎖。
  2. ReentrantLock兩者都可以,預設非公平鎖,構造方法可以傳入boolean值,true為公平鎖,false為非公平鎖。

5. 鎖綁定多個條件Condition

  1. synchronized沒有
  2. ReentrantLock用來實作分組喚醒需要喚醒的線程們,可以精确喚醒,而不是像synchronized要麼随機喚醒一個線程要麼全部喚醒線程。

6. 小結:Lock相比較Synchronized的優點

  1. ReentrantLock可中斷線程
  2. ReentrantLock可以精确喚醒線程