" />

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

Java synchronized重量級鎖實現(xiàn)過程淺析

 更新時間:2023年02月11日 15:50:25   作者:每天都要進步一點點  
這篇文章主要介紹了Java synchronized重量級鎖實現(xiàn)過程,synchronized是Java里的一個關鍵字,起到的一個效果是"監(jiān)視器鎖",它的功能就是保證操作的原子性,同時禁止指令重排序和保證內(nèi)存的可見性

一、什么是重量級鎖

當有大量的線程都在競爭同一把鎖的時候,這個時候加的鎖,就是重量級鎖。

這個重量級鎖其實指的就是JVM內(nèi)部的ObjectMonitor監(jiān)視器對象:

ObjectMonitor() {
    _header       = NULL;		//鎖對象的原始對象頭
    _count        = 0;			//搶占當前鎖的線程數(shù)量
    _waiters      = 0,			//調用wait方法后等待的線程數(shù)量
    _recursions   = 0;			//記錄鎖重入次數(shù)
    _object       = NULL;
    _owner        = NULL;		//指向持有ObjectMonitor的線程
    _WaitSet      = NULL;		//處于wait狀態(tài)的線程隊列,等待被喚醒
    _WaitSetLock  = 0 ;
    _Responsible  = NULL ;
    _succ         = NULL ;
    _cxq          = NULL ;
    FreeNext      = NULL ;
    _EntryList    = NULL ;		//等待鎖的線程隊列
    _SpinFreq     = 0 ;
    _SpinClock    = 0 ;
    OwnerIsThread = 0 ;
    _previous_owner_tid = 0;
  }

二、重量級鎖的演示

public class HightweightLockDemo02 {
    public static void main(String[] args) {
        Object objLock = new Object();
        new Thread(() -> {
            synchronized (objLock) {
                System.out.println(ClassLayout.parseInstance(objLock).toPrintable());
            }
        }, "t1").start();
        new Thread(() -> {
            synchronized (objLock) {
                System.out.println(ClassLayout.parseInstance(objLock).toPrintable());
            }
        }, "t2").start();
    }
}

運行程序:

java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           1a 33 c9 e1 (00011010 00110011 11001001 11100001) (-506907878)
      4     4        (object header)                           43 01 00 00 (01000011 00000001 00000000 00000000) (323)
      8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           1a 33 c9 e1 (00011010 00110011 11001001 11100001) (-506907878)
      4     4        (object header)                           43 01 00 00 (01000011 00000001 00000000 00000000) (323)
      8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

可見,當多個線程共同搶占同一把鎖的時候,鎖對象MarkWord的最后三位是“010”,代表的就是一個重量級鎖。

三、重量級鎖的原理

以上述代碼為例,synchronized獲取的鎖是重量級鎖,synchronized修飾代碼塊,使用javap -p -v .\HightweightLockDemo02.class指令查看其字節(jié)碼:

在編譯的時候,JVM會在同步塊開始位置插入monitorenter指令,在同步塊結束位置插入monitorexit指令。當線程執(zhí)行到monitorenter指令時,會嘗試獲取對象所對應的Monitor所有權,如果獲取成功,則表示獲取到了鎖,會在Monitor的_owner中存在當前線程的ID,這樣它將處于鎖定狀態(tài),除非退出同步塊,否則其他線程無法獲取得到這個Monitor。

四、鎖的優(yōu)缺點對比

下表是對各種狀態(tài)的鎖的對比:

鎖的類型優(yōu)點缺點適用場景
偏向鎖加鎖和解鎖不需要額外的消耗,和執(zhí)行非同步方法相比僅存在納秒級的差距如果線程間存在鎖競爭,會帶來額外的鎖撤銷的消耗適用于只有一個線程訪問同步塊場景
輕量級鎖競爭的線程不會阻塞,提高了程序的響應速度如果始終得不到鎖競爭的線程,使用自旋會消耗CPU,導致CPU空轉追求響應時間 同步塊執(zhí)行速度非???/td>
重量級鎖線程競爭不使用自旋,不會消耗CPU線程阻塞,響應時間緩慢追求吞吐量 同步塊執(zhí)行時間較長

到此這篇關于Java synchronized重量級鎖實現(xiàn)過程淺析的文章就介紹到這了,更多相關Java synchronized 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 徹底理解Spring注解@Autowired實現(xiàn)原理

    徹底理解Spring注解@Autowired實現(xiàn)原理

    這篇文章主要為大家詳細的介紹了Spring注解@Autowired實現(xiàn)的原理,縝密的邏輯分析,實踐應用示例操作說明,讓大家徹底的理解Spring注解@Autowired背后實現(xiàn)原理
    2022-03-03
  • Java異常處理之try...catch...finally詳解

    Java異常處理之try...catch...finally詳解

    今天小編就為大家分享一篇關于Java異常處理之try...catch...finally詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Spring整合Mybatis方式之注冊映射器

    Spring整合Mybatis方式之注冊映射器

    這篇文章主要介紹了Spring整合Mybatis方式之注冊映射器,MapperFactoryBean注冊映射器的最大問題,就是需要一個個注冊所有的映射器,而實際上mybatis-spring提供了掃描包下所有映射器接口的方法,每種方式給大家介紹的非常詳細,需要的朋友參考下吧
    2024-03-03
  • Java代理的幾種實現(xiàn)方式總結

    Java代理的幾種實現(xiàn)方式總結

    本文將通過例子說明java代理的幾種實現(xiàn)方式,并比較它們之間的差異,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的參考價值,需要的朋友可以參考下
    2023-12-12
  • JAVA實戰(zhàn)練習之圖書管理系統(tǒng)實現(xiàn)流程

    JAVA實戰(zhàn)練習之圖書管理系統(tǒng)實現(xiàn)流程

    隨著網(wǎng)絡技術的高速發(fā)展,計算機應用的普及,利用計算機對圖書館的日常工作進行管理勢在必行,本篇文章手把手帶你用Java實現(xiàn)一個圖書管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-10-10
  • SpringBoot實現(xiàn)熱部署的三種方式

    SpringBoot實現(xiàn)熱部署的三種方式

    本文主要介紹了SpringBoot實現(xiàn)熱部署的三種方式,主要包括配置pom.xml文件,使用插件的執(zhí)行命令mvn spring-boot:run啟動項,使用springloader本地啟動修改jvm參數(shù),使用devtools工具包,感興趣的可以了解一下
    2023-12-12
  • Java中的stream流的概念解析及實際運用總結

    Java中的stream流的概念解析及實際運用總結

    流是指傳輸時的數(shù)據(jù),Java為流準備了很多內(nèi)置類,尤其是IO輸入輸出流非常常用,這里我們來看一下Java中的stream流的概念解析及實際運用總結
    2016-06-06
  • 如何優(yōu)雅的處理Spring Boot異常信息詳解

    如何優(yōu)雅的處理Spring Boot異常信息詳解

    這篇文章主要給大家介紹了關于如何優(yōu)雅的處理Spring Boot異常信息的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • SpringBoot中的異常處理與參數(shù)校驗的方法實現(xiàn)

    SpringBoot中的異常處理與參數(shù)校驗的方法實現(xiàn)

    這篇文章主要介紹了SpringBoot中的異常處理與參數(shù)校驗的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • springboot?publish?event?事件機制demo分享

    springboot?publish?event?事件機制demo分享

    這篇文章主要介紹了springboot?publish?event?事件機制demo,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論

夹江县| 顺昌县| 长兴县| 隆子县| 杭锦后旗| 会昌县| 新化县| 偃师市| 斗六市| 唐海县| 沛县| 且末县| 凤庆县| 宜昌市| 天津市| 盘锦市| 平阳县| 迁西县| 石楼县| 抚远县| 宣恩县| 长宁县| 元江| 东安县| 新和县| 双城市| 抚松县| 庐江县| 蒙阴县| 永平县| 宝应县| 桃源县| 德格县| 长顺县| 西平县| 建阳市| 千阳县| 开阳县| 高雄县| 诏安县| 江陵县|