最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解讀synchronized鎖的釋放機(jī)制

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

synchronized鎖的釋放機(jī)制

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

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

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

正常執(zhí)行結(jié)束

當(dāng)線程執(zhí)行完 synchronized 修飾的代碼塊或方法時(shí),JVM 會(huì)自動(dòng)調(diào)用 monitorexit 指令釋放鎖。

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

異常退出

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

顯式調(diào)用 wait()

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

二、鎖釋放的核心機(jī)制

計(jì)數(shù)器遞減

  • 每個(gè)對(duì)象關(guān)聯(lián)一個(gè) Monitor 鎖,內(nèi)部維護(hù)一個(gè)計(jì)數(shù)器(_count)。
  • 線程每次進(jìn)入 synchronized 代碼塊時(shí)計(jì)數(shù)器加 1,退出時(shí)減 1。
  • 當(dāng)計(jì)數(shù)器歸零時(shí),鎖完全釋放,其他線程可競(jìng)爭(zhēng)獲取。

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

  • 持有鎖的線程(_owner:釋放鎖后,_owner 置為 null,計(jì)數(shù)器歸零。
  • 等待隊(duì)列(_EntryList_WaitSet:鎖釋放后,JVM 會(huì)從 _EntryList_WaitSet 中喚醒線程重新競(jìng)爭(zhēng)鎖。

三、不同場(chǎng)景的鎖釋放示例

1. 同步代碼塊

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

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

2. 同步方法

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

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

3. 異常場(chǎng)景

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

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

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

同步代碼塊

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

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

同步方法

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

五、注意事項(xiàng)

不會(huì)釋放鎖的操作

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

可重入性

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

總結(jié)

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

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java,C#使用二進(jìn)制序列化、反序列化操作數(shù)據(jù)

    Java,C#使用二進(jìn)制序列化、反序列化操作數(shù)據(jù)

    這篇文章主要介紹了Java,C#使用二進(jìn)制序列化、反序列化操作數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2014-10-10
  • SpringBoot整合mysql、postgres及sqlserver實(shí)現(xiàn)多數(shù)據(jù)源配置實(shí)戰(zhàn)案例

    SpringBoot整合mysql、postgres及sqlserver實(shí)現(xiàn)多數(shù)據(jù)源配置實(shí)戰(zhàn)案例

    在工作中業(yè)務(wù)的發(fā)展或業(yè)務(wù)數(shù)據(jù)隔離的場(chǎng)景下,通常需要一個(gè)項(xiàng)目中引入多個(gè)數(shù)據(jù)源,但SpringBoot默認(rèn)的自動(dòng)化配置是單數(shù)據(jù)源的,這篇文章主要給大家介紹了關(guān)于SpringBoot整合mysql、postgres及sqlserver實(shí)現(xiàn)多數(shù)據(jù)源配置的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決

    MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決

    這篇文章主要介紹了MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • 簡(jiǎn)單介紹一下什么是microservice微服務(wù)

    簡(jiǎn)單介紹一下什么是microservice微服務(wù)

    這篇文章主要介紹了一下什么是microservice微服務(wù)微服務(wù)的定義,微服務(wù)到底是什么意思?什么樣的架構(gòu)可以叫做微服務(wù)?這篇文章可以給你答案
    2023-03-03
  • SpringBoot操作Mongodb的實(shí)現(xiàn)示例

    SpringBoot操作Mongodb的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot操作Mongodb的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringBoot-Maven打包壓縮瘦身方式

    SpringBoot-Maven打包壓縮瘦身方式

    這篇文章主要介紹了SpringBoot-Maven打包壓縮瘦身方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringBoot擴(kuò)展SpringMVC原理并實(shí)現(xiàn)全面接管

    SpringBoot擴(kuò)展SpringMVC原理并實(shí)現(xiàn)全面接管

    這篇文章主要介紹了SpringBoot擴(kuò)展SpringMVC原理并實(shí)現(xiàn)全面接管,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • jdk線程池的實(shí)現(xiàn)

    jdk線程池的實(shí)現(xiàn)

    本文主要介紹了jdk線程池的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 解決nacos項(xiàng)目啟動(dòng)報(bào)錯(cuò):Connection refused: no further informa問題

    解決nacos項(xiàng)目啟動(dòng)報(bào)錯(cuò):Connection refused: no further&

    這篇文章主要介紹了解決nacos項(xiàng)目啟動(dòng)報(bào)錯(cuò):Connection refused: no further informa問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 關(guān)于ArrayList初始化容量的問題

    關(guān)于ArrayList初始化容量的問題

    這篇文章主要介紹了關(guān)于ArrayList初始化容量的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評(píng)論

织金县| 炉霍县| 孝感市| 三江| 灌阳县| 丰县| 汤阴县| 湖州市| 喀喇沁旗| 唐河县| 电白县| 陆丰市| 安溪县| 策勒县| 麟游县| 封丘县| 山阴县| 修水县| 印江| 台中县| 利川市| 临汾市| 平舆县| 阿克苏市| 石阡县| 沙湾县| 玉田县| 常山县| 延津县| 平远县| 克拉玛依市| 山东省| 阿拉尔市| 宣威市| 鲁甸县| 措勤县| 修文县| 梧州市| 安乡县| 博罗县| 绥江县|