Synchronized 與 Lock 的5種區別

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

  1. 原始構成

    synchronized 是關鍵字,屬於 JVM 層面
    monitorenter (底層是通過 monitor 對象來完成的,其實 wait/notify 等方法也依賴與 monitor 對象,只有在同步塊或者方法中才能調用 wait/notify 等方法)
    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() 放代碼塊中,調用 interrupted() 方法可中斷
  4. 加鎖是否公平

    synchronized 非公平鎖

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

  5. 鎖綁定多個條件 condition

    synchronized 沒有

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

superbeyone - GitHub

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