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

Java?Synchronize底層原理總結(jié)

 更新時(shí)間:2023年06月14日 08:43:24   作者:EzreaLwj  
這篇文章主要給大家總結(jié)了Java?Synchronize底層原理,文中的圖文講解介紹的非常詳細(xì),對(duì)我們學(xué)習(xí)Java?Synchronize有一定的幫助,需要的朋友可以參考下

對(duì)象內(nèi)存結(jié)構(gòu)

對(duì)象頭MarkWord 存儲(chǔ)對(duì)象頭的信息,Klass Word 描述對(duì)象實(shí)例的具體類型

實(shí)例數(shù)據(jù):成員變量

對(duì)齊填充:如果對(duì)象頭 + 實(shí)例變量 不是 8 的整數(shù)倍,則通過對(duì)齊填充補(bǔ)齊

MarkWord 解析

  • hashcode:25位的對(duì)象標(biāo)識(shí)Hash碼
  • age:對(duì)象分代年齡占4位
  • biased_lock:偏向鎖標(biāo)識(shí),占1位,0表示沒有開始偏向鎖,1表示開啟了偏向鎖
  • thread:持有偏向鎖的線程ID,占23位
  • epoch:偏向時(shí)間戳,占2位
  • ptr_to_lock_record:輕量級(jí)鎖狀態(tài)下,指向棧中鎖記錄的指針,占30位
  • ptr_to_heavyweight_monitor:重量級(jí)鎖狀態(tài)下,指向?qū)ο蟊O(jiān)視器Monitor的指針,占30位

LockRecord 鎖記錄

Markword:記錄鎖記錄的地址

對(duì)象引用:引用被加上鎖了的對(duì)象

重量級(jí)鎖

Monitor

Monitor 監(jiān)視器,是由 jvm 提供的,由 C++ 實(shí)現(xiàn)的,有三個(gè)實(shí)現(xiàn)部分

WaitSet:調(diào)用了 wait 方法的線程在這里等待,處于 WAITED 狀態(tài)

EntryList:沒有搶到對(duì)象鎖的線程在這里等待,處于 BLOCKED 狀態(tài)

Owner:存儲(chǔ)已經(jīng)搶到鎖的線程對(duì)象

Monitor 的實(shí)現(xiàn)屬于重量級(jí)鎖,涉及到 內(nèi)核態(tài)和用戶態(tài)的切換,線程的上下文切換,每個(gè) Java 對(duì)象都會(huì)關(guān)聯(lián)一個(gè) Monitor 對(duì)象,如果使用 Synchronize 給該對(duì)象加鎖,那么 Java 對(duì)象上面的 MarkWord 地址就被設(shè)置為指向該 Monitor 對(duì)象的指針

輕量級(jí)鎖

加鎖流程

  • 在線程棧中創(chuàng)建一個(gè) Lock Record 對(duì)象,它的 object reference 字段指向鎖對(duì)象
  • 通過 CAS 指令把 Lock Record 的地址存放到對(duì)象頭的 Markword 中,如果是無鎖狀態(tài)則修改成功,代表該線程獲取了輕量級(jí)鎖
  • 如果當(dāng)前線程已經(jīng)持有該鎖,就代表是一次鎖重入,設(shè)置 Lock Record 的第一部分為 null,起到一個(gè)重入計(jì)數(shù)器的作用
  • 如果 CAS 修改失敗,則說明發(fā)生了競爭,需要膨脹為重量級(jí)鎖

解鎖過程

  • 遍歷線程棧,找到所有 object reference 字段等于當(dāng)前鎖對(duì)象的 Lock record
  • 如果 Lock recordMarkWordnull,代表這是一次重入,將 obj 設(shè)置為 nullcontinue 即可
  • 如果 Lock recordMarkword 不為 null,則利用 CAS 指令將對(duì)象頭的 markword 與對(duì)象對(duì)象頭的 markword 進(jìn)行替換,如果成功則恢復(fù)無鎖狀態(tài),如果失敗膨脹重量級(jí)鎖

Markword 記錄

開始時(shí)的狀態(tài)

替換后的狀態(tài)

偏向鎖

背景:輕量級(jí)鎖在沒有競爭的時(shí)候,每次重入都需要進(jìn)行 CAS 操作

Java 6 中 引入偏向鎖來做進(jìn)一步的優(yōu)化:只有第一次 操才使用 CAS 將線程 ID 設(shè)置到對(duì)象的 markword 頭,之后發(fā)現(xiàn)這個(gè)線程 ID 是自己就不會(huì)產(chǎn)生競爭,不用重新 CAS,以后只要不發(fā)生競爭,這個(gè)對(duì)象就歸這個(gè)線程所有

代碼示例:

public class Thread5 {
    private static final Object object = new Object();
    public static void method1() {
        synchronized (object) {
            method2();
        }
    }
    public static void method2() {
        synchronized (object) {
            method3();
        }
    }
    public static void method3() {
        synchronized (object) {
        }
    }
}

總結(jié)

Java 中的 Synchronize 有偏向鎖、輕量級(jí)鎖、重量級(jí)鎖三種形式,分別對(duì)應(yīng)了鎖只被一個(gè)線程持有、不同線程交替持有鎖、多線程競爭的情況

重量級(jí)鎖:底層使用 Monitor 實(shí)現(xiàn),里面涉及到了用戶態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換、進(jìn)程的上下文切換,成本較高,性能比較低

輕量級(jí)鎖:線程加鎖時(shí)間是錯(cuò)開的(也就是沒有競爭),可以用輕量級(jí)鎖來優(yōu)化,輕量級(jí)修改了對(duì)象頭的鎖標(biāo)志,相對(duì)重量級(jí)鎖性能提升了許多,每次修改都是 CAS 操作,保證原子性

偏向鎖:一段很長的時(shí)間內(nèi)都只被一個(gè)線程使用鎖,可以使用偏向鎖,第一次獲得鎖時(shí),會(huì)有一個(gè) CAS 操作,之后該線程再獲取鎖,只需要判斷 mark word 中是否是自己的線程 id 即可,而不是開銷相對(duì)較大的 CAS 命令

以上就是Java Synchronize底層原理總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Java Synchronize底層原理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • spring cloud內(nèi)容匯總(各個(gè)功能模塊、啟動(dòng)、部署)的詳細(xì)過程

    spring cloud內(nèi)容匯總(各個(gè)功能模塊、啟動(dòng)、部署)的詳細(xì)過程

    Spring Cloud 是一套基于 Spring Boot 的框架集合,用于構(gòu)建分布式微服務(wù)架構(gòu),文章介紹了Spring Cloud框架及其相關(guān)工具的使用,還詳細(xì)介紹了如何配置和使用這些功能,包括配置文件、依賴管理以及實(shí)際應(yīng)用示例,感興趣的朋友一起看看吧
    2024-11-11
  • springboot項(xiàng)目中常用的工具類和api詳解

    springboot項(xiàng)目中常用的工具類和api詳解

    在Spring Boot項(xiàng)目中,開發(fā)者通常會(huì)依賴一些工具類和API來簡化開發(fā)、提高效率,以下是一些常用的工具類及其典型應(yīng)用場景,涵蓋 Spring 原生工具、第三方庫(如Hutool、Guava) 和 Java 自帶工具,本文給大家介紹springboot項(xiàng)目中常用的工具類和api,感興趣的朋友一起看看吧
    2025-04-04
  • Java中stream流處理實(shí)現(xiàn)數(shù)據(jù)分組合并

    Java中stream流處理實(shí)現(xiàn)數(shù)據(jù)分組合并

    本文主要介紹了Java中stream流處理實(shí)現(xiàn)數(shù)據(jù)分組合并,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • SpringMVC請(qǐng)求參數(shù)別名設(shè)置方式

    SpringMVC請(qǐng)求參數(shù)別名設(shè)置方式

    文章介紹了SpringMVC中請(qǐng)求參數(shù)的別名設(shè)置方法,通常,接收參數(shù)時(shí)要求參數(shù)名一致,通過@RequestParam注解的value屬性,可以為參數(shù)設(shè)置別名,實(shí)現(xiàn)參數(shù)名不一致時(shí)的準(zhǔn)確接收
    2025-10-10
  • Mybatis如何實(shí)現(xiàn)InsertOrUpdate功能

    Mybatis如何實(shí)現(xiàn)InsertOrUpdate功能

    這篇文章主要介紹了Mybatis如何實(shí)現(xiàn)InsertOrUpdate功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java實(shí)現(xiàn)插入排序,希爾排序和歸并排序

    Java實(shí)現(xiàn)插入排序,希爾排序和歸并排序

    這篇文章主要為大家詳細(xì)介紹了插入排序,希爾排序和歸并排序的多種語言的實(shí)現(xiàn)(JavaScript、Python、Go語言、Java),感興趣的小伙伴可以了解一下
    2022-12-12
  • Java并發(fā)編程之ConcurrentLinkedQueue源碼詳解

    Java并發(fā)編程之ConcurrentLinkedQueue源碼詳解

    今天帶小伙伴們學(xué)習(xí)一下Java并發(fā)編程之Java ConcurrentLinkedQueue源碼,本篇文章詳細(xì)分析了ConcurrentLinkedQueue源碼,有代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助喲,需要的朋友可以參考下
    2021-05-05
  • Java?HashMap底層原理的全方位深度解析

    Java?HashMap底層原理的全方位深度解析

    Java中的HashMap是我們?cè)陂_發(fā)中經(jīng)常使用的集合之一,它提供了基于哈希表的數(shù)據(jù)存儲(chǔ)方式,使得對(duì)數(shù)據(jù)的插入、刪除和查找操作都具有較高的效率,這篇文章主要介紹了Java?HashMap底層原理的全方位深度解析,需要的朋友可以參考下
    2026-02-02
  • Springboot注解@Value讀取配置文件參數(shù)詳解

    Springboot注解@Value讀取配置文件參數(shù)詳解

    Spring Boot提供了靈活的配置文件讀取機(jī)制,主要有兩種方式,第一種是使用@Value注解直接在類屬性上讀取application.yml文件中的配置,這種方式簡單直接,但需要為每個(gè)配置項(xiàng)單獨(dú)設(shè)置屬性,第二種方式是通過@PropertySource注解讀取自定義的Properties文件
    2024-11-11
  • springboot的logging.group日志分組方法源碼流程解析

    springboot的logging.group日志分組方法源碼流程解析

    這篇文章主要為大家介紹了springboot的logging.group日志分組方法源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評(píng)論

乐昌市| 娄底市| 桓台县| 徐州市| 札达县| 固镇县| 义马市| 和田县| 寿阳县| 民县| 孟村| 丹江口市| 开江县| 罗江县| 垦利县| 禹城市| 涿州市| 鄂州市| 孟州市| 锡林浩特市| 公安县| 闸北区| 阿荣旗| 泽普县| 晴隆县| 许昌市| 盐边县| 深泽县| 潞城市| 通许县| 陈巴尔虎旗| 吐鲁番市| 武功县| 织金县| 奉新县| 金华市| 嘉峪关市| 得荣县| 宁武县| 泸水县| 巴里|