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

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

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

synchronized鎖的釋放機(jī)制

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

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

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

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

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

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

異常退出

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

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

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

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

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

  • 每個(gè)對象關(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í),鎖完全釋放,其他線程可競爭獲取。

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

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

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

1. 同步代碼塊

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

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

2. 同步方法

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

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

3. 異常場景

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

即使未捕獲異常,JVM 也會執(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)

不會釋放鎖的操作

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

可重入性

  • 同一線程可多次獲取鎖(計(jì)數(shù)器遞增)
  • 需對應(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ù)隔離的場景下,通常需要一個(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à)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • 簡單介紹一下什么是microservice微服務(wù)

    簡單介紹一下什么是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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringBoot-Maven打包壓縮瘦身方式

    SpringBoot-Maven打包壓縮瘦身方式

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

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

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

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

    本文主要介紹了jdk線程池的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(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à)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 關(guān)于ArrayList初始化容量的問題

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

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

最新評論

平陆县| 佛冈县| 亳州市| 文水县| 介休市| 克拉玛依市| 应城市| 司法| 商城县| 鄂托克前旗| 建瓯市| 贡山| 浏阳市| 特克斯县| 道孚县| 兴山县| 刚察县| 三明市| 神农架林区| 鱼台县| 阿图什市| 哈尔滨市| 河北省| 通海县| 通城县| 丰县| 武川县| 牟定县| 攀枝花市| 石屏县| 井研县| 吉安县| 临海市| 商南县| 东丽区| 紫金县| 乌拉特前旗| 喜德县| 宝山区| 五莲县| 和平县|