亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java鎖升級(jí)的實(shí)現(xiàn)過(guò)程

 更新時(shí)間:2020年05月17日 11:43:36   作者:zycxnanwang  
這篇文章主要介紹了Java鎖升級(jí)的實(shí)現(xiàn)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

對(duì)象內(nèi)存布局

Java對(duì)象在內(nèi)存中存儲(chǔ)的布局可以分為3塊區(qū)域: 對(duì)象頭、實(shí)例數(shù)據(jù)、對(duì)齊填充。

對(duì)象頭,分為兩個(gè)部分,第一個(gè)部分存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù),又稱為Mark Word,32位虛擬機(jī)占32bit,64位虛擬機(jī)占64bit。如圖所示,不同鎖狀態(tài)下,Mark Word的結(jié)構(gòu),理解下面要介紹的各種鎖,和鎖升級(jí)過(guò)程,都需要先充分了解Mark Word的結(jié)構(gòu)。

第二部分是類型指針,指向類元數(shù)據(jù)指針,虛擬機(jī)通過(guò)此指針,確定該對(duì)象屬于那個(gè)類的實(shí)例。

輕量級(jí)鎖

輕量級(jí)鎖是相對(duì)于重量級(jí)鎖(Synchrnoized)而言的,本意是在沒(méi)有多線程競(jìng)爭(zhēng)的前提下,減少傳統(tǒng)的重量級(jí)鎖使用操作系統(tǒng)互斥量產(chǎn)生的性能消耗。

輕量級(jí)鎖的獲取

線程進(jìn)入同步塊時(shí),如果此同步對(duì)象沒(méi)有被鎖定(即鎖標(biāo)志位為01,是否為偏向鎖為0),虛擬機(jī)在當(dāng)前線程的棧幀中建立一個(gè)名為鎖記錄(Lock Record)的空間,用于存儲(chǔ)鎖對(duì)象目前的一個(gè)Mark Word的copy

然后虛擬機(jī)使用CAS操作,嘗試將Mark World更新為指向Lock Record的指針,如果更新成功,那么線程擁有了該對(duì)象的鎖,并且將鎖標(biāo)志位置位00,如圖所示

一旦有兩條以上的線程搶占該鎖,輕量級(jí)鎖會(huì)升級(jí)為重量級(jí)鎖。鎖標(biāo)志位置為10,Mark Word存儲(chǔ)的就是指向重量級(jí)鎖的指針

輕量級(jí)鎖釋

  • 放如果對(duì)象的Mark Word仍然指向著線程的鎖記錄, 那就用CAS操作把對(duì)象當(dāng)前的Mark Word和線程中復(fù)制的Displaced Mark Word替換回來(lái), 如果替換成功, 整個(gè)同步過(guò)程就完成了。
  • 如果替換失敗, 說(shuō)明有其他線程嘗試過(guò)獲取該鎖,輕量級(jí)鎖膨脹為重量級(jí)鎖,那就要在釋放鎖的同時(shí), 喚醒被掛起的線程。

偏向鎖

引入偏向鎖的目的是在沒(méi)有多線程競(jìng)爭(zhēng)的前提下,進(jìn)一步減少線程同步的性能消耗。

偏向鎖的獲取

開(kāi)啟偏向鎖模式后,鎖第一次被線程獲取的時(shí)候,虛擬機(jī)會(huì)把對(duì)象頭中是否為偏向鎖的標(biāo)志位設(shè)位0,同時(shí)使用CAS操作把獲取到這個(gè)鎖的線程的ID記錄在對(duì)象的Mark Word之中。

當(dāng)有另外一個(gè)線程去嘗試獲取這個(gè)鎖時(shí), 偏向模式就宣告結(jié)束。 根據(jù)鎖對(duì)象目前是否處于被鎖定的狀態(tài), 撤銷偏向( Revoke Bias) 后恢復(fù)到未鎖定( 標(biāo)志位為“01”)或輕量級(jí)鎖定( 標(biāo)志位為“00”) 的狀態(tài)

偏向鎖的釋放

偏向鎖,并沒(méi)有顯式的鎖釋放過(guò)程,主要依靠鎖的批量再偏向(Bulk Rebias)機(jī)制實(shí)現(xiàn)鎖釋放。

該機(jī)制的主要工作原理如下:

  • 引入一個(gè)概念 epoch, 其本質(zhì)是一個(gè)時(shí)間戳 , 代表了偏向鎖的有效性,從前文描述的對(duì)象頭結(jié)構(gòu)中可以看到, epoch 存儲(chǔ)在可偏向?qū)ο蟮?MarkWord 中。
  • 除了對(duì)象中的 epoch, 對(duì)象所屬的類 class 信息中, 也會(huì)保存一個(gè) epoch 值,每當(dāng)遇到一個(gè)全局安全點(diǎn)時(shí), 如果要對(duì) class 進(jìn)行批量再偏向, 則首先對(duì) class 中保存的 epoch 進(jìn)行增加操作, 得到一個(gè)新的 epoch_new
  • 然后掃描所有持有 class 實(shí)例的線程棧,根據(jù)線程棧的信息判斷出該線程是否鎖定了該對(duì)象, 僅將epoch_new 的值賦給被鎖定的對(duì)象中。
  • 退出安全點(diǎn)后, 當(dāng)有線程需要嘗試獲取偏向鎖時(shí), 直接檢查 class中存儲(chǔ)的 epoch 值是否與目標(biāo)對(duì)象中存儲(chǔ)的 epoch 值相等,如果不相等, 則說(shuō)明該對(duì)象的偏向鎖已經(jīng)無(wú)效了, 可以嘗試對(duì)此對(duì)象重新進(jìn)行偏向操作。

整個(gè)鎖升級(jí)過(guò)程

參考文章

偏向鎖,輕量級(jí)鎖與重量級(jí)鎖的區(qū)別與膨脹

Java中的偏向鎖,輕量級(jí)鎖, 重量級(jí)鎖解析

到此這篇關(guān)于Java鎖升級(jí)的實(shí)現(xiàn)過(guò)程的文章就介紹到這了,更多相關(guān)Java鎖升級(jí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java編程中使用XFire框架調(diào)用WebService程序接口

    Java編程中使用XFire框架調(diào)用WebService程序接口

    這篇文章主要介紹了Java編程中使用XFire調(diào)用WebService程序接口的方法,WebService是一種跨編程語(yǔ)言和跨操作系統(tǒng)平臺(tái)的遠(yuǎn)程調(diào)用技術(shù),需要的朋友可以參考下
    2015-12-12
  • mybatis一對(duì)一查詢功能

    mybatis一對(duì)一查詢功能

    所謂的一對(duì)一查詢,就是說(shuō)我們?cè)诓樵円粋€(gè)表的數(shù)據(jù)的時(shí)候,需要關(guān)聯(lián)查詢其他表的數(shù)據(jù)。這篇文章主要介紹了mybatis一對(duì)一查詢功能,需要的朋友可以參考下
    2017-02-02
  • Spring?Validation接口入?yún)⑿r?yàn)示例代碼

    Spring?Validation接口入?yún)⑿r?yàn)示例代碼

    Spring?Validation是一種用于實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)的框架,它提供了一系列的校驗(yàn)器,針對(duì)不同的數(shù)據(jù)類型可以使用不同的校驗(yàn)器進(jìn)行校驗(yàn),下面這篇文章主要給大家介紹了關(guān)于Spring?Validation接口入?yún)⑿r?yàn)的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • spring注解識(shí)別一個(gè)接口的多個(gè)實(shí)現(xiàn)類方法

    spring注解識(shí)別一個(gè)接口的多個(gè)實(shí)現(xiàn)類方法

    下面小編就為大家?guī)?lái)一篇spring注解識(shí)別一個(gè)接口的多個(gè)實(shí)現(xiàn)類方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • 解決Spring security5.5.7報(bào)錯(cuò)Encoded password does not look like BCrypt異常

    解決Spring security5.5.7報(bào)錯(cuò)Encoded password does

    這篇文章主要介紹了解決Spring security5.5.7出現(xiàn)Encoded password does not look like BCrypt異常問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 詳解Java中Stream流的用法和原理

    詳解Java中Stream流的用法和原理

    最近編碼的時(shí)候用到了Stream這個(gè)東西,以前也用過(guò),但是對(duì)它沒(méi)有一個(gè)系統(tǒng)的認(rèn)知,在好奇心的驅(qū)動(dòng)下還是決定花一些時(shí)間去系統(tǒng)地學(xué)一學(xué),不了解Stream的同學(xué)可以看看本文,對(duì)大家的學(xué)習(xí)和工作有一定的幫助
    2023-10-10
  • SpringMVC 參數(shù)綁定之視圖傳參到控制器的實(shí)現(xiàn)代碼

    SpringMVC 參數(shù)綁定之視圖傳參到控制器的實(shí)現(xiàn)代碼

    這篇文章主要介紹了SpringMVC 參數(shù)綁定之視圖傳參到控制器的相關(guān)知識(shí),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Springboot使用@Valid 和AOP做參數(shù)校驗(yàn)及日志輸出問(wèn)題

    Springboot使用@Valid 和AOP做參數(shù)校驗(yàn)及日志輸出問(wèn)題

    這篇文章主要介紹的Springboot使用@Valid 和AOP做參數(shù)校驗(yàn)及日志輸出問(wèn)題,本文通過(guò)代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java深入淺出掌握SpringBoot之MVC自動(dòng)配置原理篇

    Java深入淺出掌握SpringBoot之MVC自動(dòng)配置原理篇

    在進(jìn)行項(xiàng)目編寫(xiě)前,我們還需要知道一個(gè)東西,就是SpringBoot對(duì)我們的SpringMVC還做了哪些配置,包括如何擴(kuò)展,如何定制,只有把這些都搞清楚了,我們?cè)谥笫褂貌艜?huì)更加得心應(yīng)手
    2021-10-10
  • springBoot的事件機(jī)制GenericApplicationListener用法解析

    springBoot的事件機(jī)制GenericApplicationListener用法解析

    這篇文章主要介紹了springBoot的事件機(jī)制GenericApplicationListener用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值的相關(guān)資料
    2019-09-09

最新評(píng)論