欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解讀synchronized鎖的釋放機制

 更新時間:2025年04月17日 16:44:15   作者:墮落年代  
這篇文章主要介紹了synchronized鎖的釋放機制,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

synchronized鎖的釋放機制

synchronized 鎖的釋放機制是通過 JVM 底層的 Monitor 鎖模型計數器機制 實現(xiàn)的。

以下是具體的釋放邏輯和觸發(fā)條件:

一、鎖釋放的觸發(fā)條件

正常執(zhí)行結束

當線程執(zhí)行完 synchronized 修飾的代碼塊或方法時,JVM 會自動調用 monitorexit 指令釋放鎖。

  • 同步代碼塊:通過 monitorentermonitorexit 指令顯式控制鎖的獲取與釋放。
  • 同步方法:通過 ACC_SYNCHRONIZED 標志隱式觸發(fā)鎖的獲取和釋放,方法結束時自動釋放鎖。

異常退出

  • 如果在 synchronized 代碼塊或方法中拋出未捕獲的異常,JVM 會執(zhí)行 monitorexit 指令釋放鎖。
  • 編譯時會為同步代碼塊生成兩個 monitorexit 指令:一個用于正常退出,另一個用于異常路徑。

顯式調用 wait()

  • 線程在 synchronized 代碼塊內調用 wait() 方法時
  • 會暫時釋放鎖并進入等待狀態(tài),直到其他線程調用 notify()/notifyAll() 喚醒它

二、鎖釋放的核心機制

計數器遞減

  • 每個對象關聯(lián)一個 Monitor 鎖,內部維護一個計數器(_count)。
  • 線程每次進入 synchronized 代碼塊時計數器加 1,退出時減 1。
  • 當計數器歸零時,鎖完全釋放,其他線程可競爭獲取。

Monitor 對象的狀態(tài)管理

  • 持有鎖的線程(_owner:釋放鎖后,_owner 置為 null,計數器歸零。
  • 等待隊列(_EntryList_WaitSet:鎖釋放后,JVM 會從 _EntryList_WaitSet 中喚醒線程重新競爭鎖。

三、不同場景的鎖釋放示例

1. 同步代碼塊

public void method() {
    synchronized (this) {
        // 代碼邏輯
    } // 此處自動執(zhí)行 monitorexit 釋放鎖
}

無論正常結束還是拋出異常,monitorexit 都會觸發(fā)鎖釋放。

2. 同步方法

public synchronized void method() {
    // 代碼邏輯
} // 方法結束自動釋放鎖

通過 ACC_SYNCHRONIZED 標志隱式管理鎖,無需顯式字節(jié)碼指令。

3. 異常場景

public void method() {
    synchronized (this) {
        throw new RuntimeException(); // 觸發(fā)異常,自動釋放鎖
    }
}

即使未捕獲異常,JVM 也會執(zhí)行 monitorexit 指令釋放鎖。

四、鎖釋放的底層實現(xiàn)(字節(jié)碼層面)

同步代碼塊

編譯后生成 monitorenter 和兩個 monitorexit(正常退出和異常退出)指令:

public void method();
  Code:
     0: aload_0
     1: dup
     2: astore_1
     3: monitorenter     // 獲取鎖
     4: ...              // 業(yè)務代碼
    13: monitorexit      // 正常退出釋放鎖
    14: goto 20
    17: aload_1
    18: monitorexit      // 異常退出釋放鎖
    19: athrow
    20: return

同步方法

方法訪問標志包含 ACC_SYNCHRONIZED,JVM 在方法入口和出口隱式管理鎖。

五、注意事項

不會釋放鎖的操作

  • Thread.sleep()、Thread.yield() 不會釋放鎖。
  •  線程掛起(如 suspend())也不會釋放鎖。

可重入性

  • 同一線程可多次獲取鎖(計數器遞增)
  • 需對應次數的退出操作才能完全釋放

總結

synchronized 鎖的釋放依賴于 JVM 的 Monitor 模型和計數器機制,通過以下方式觸發(fā):

  1. 代碼塊或方法正常結束。
  2. 未捕獲異常拋出。
  3. 顯式調用 wait()
  4. 其底層通過 monitorexit 指令或隱式標志確保鎖的正確釋放,保障線程安全。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java 中Flyway的使用詳解

    Java 中Flyway的使用詳解

    這篇文章主要介紹了Java 中Flyway的使用詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 設置JavaScript自動提示-Eclipse/MyEclipse

    設置JavaScript自動提示-Eclipse/MyEclipse

    自動提示需要2個組件,分別是:ext-4.0.2a.jsb2||spket-1.6.16.jar,需要的朋友可以參考下
    2016-05-05
  • Springboot系列之kafka操作使用詳解

    Springboot系列之kafka操作使用詳解

    這篇文章主要為大家介紹了Springboot系列之kafka操作使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Java十分鐘精通異常處理機制

    Java十分鐘精通異常處理機制

    異常就是不正常,比如當我們身體出現(xiàn)了異常我們會根據身體情況選擇喝開水、吃藥、看病、等?異常處理方法。?java異常處理機制是我們java語言使用異常處理機制為程序提供了錯誤處理的能力,程序出現(xiàn)的錯誤,程序可以安全的退出,以保證程序正常的運行等
    2022-03-03
  • Java 中的vector和list的區(qū)別和使用實例詳解

    Java 中的vector和list的區(qū)別和使用實例詳解

    在大家還沒有了解vector,list,deque的知識之前,我先給大家介紹下stl,本文重點給大家介紹vector和list的區(qū)別及使用,感興趣的的朋友一起看看吧
    2017-09-09
  • 深入了解JAVA HASHMAP的死循環(huán)

    深入了解JAVA HASHMAP的死循環(huán)

    HASHMAP基于哈希表的 Map 接口的實現(xiàn)。此實現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)下面小編來帶大家詳細了解下吧
    2019-06-06
  • 如何查看java進程內存占用情況

    如何查看java進程內存占用情況

    這篇文章主要介紹了如何查看java進程內存占用情況問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳解RocketMQ 消費端如何監(jiān)聽消息

    詳解RocketMQ 消費端如何監(jiān)聽消息

    這篇文章主要為大家介紹了RocketMQ 消費端如何監(jiān)聽消息示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • java+testng+selenium的自動化測試實例

    java+testng+selenium的自動化測試實例

    這篇文章主要介紹了java+testng+selenium的自動化測試實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java8函數式接口的基礎學習教程

    Java8函數式接口的基礎學習教程

    這篇文章主要給大家介紹了關于Java8函數式接口基礎學習的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04

最新評論