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

JAVA對象分析之偏向鎖、輕量級鎖、重量級鎖升級過程

 更新時間:2021年02月03日 17:29:08   作者:等不到的口琴  
這篇文章主要介紹了JAVA對象分析之偏向鎖、輕量級鎖、重量級鎖升級過程,又對這方面感興趣的同學(xué)可以跟著一起研究下

在HotSpot虛擬機里,對象在堆內(nèi)存中的存儲布局可以劃分為三個部分:

對象頭(Header)

實例數(shù)據(jù)(Instance Data)

對齊填充(Padding)。

對象頭

HotSpot虛擬機(后面沒有說明的話默認(rèn)是這個虛擬機)對象頭包括三部分:

  1. Mark Word
  2. 指向類的指針
  3. 數(shù)組長度(只有數(shù)組對象才有)

對象頭之Mark Word

Mark Word記錄了對象和鎖有關(guān)的信息,當(dāng)這個對象被synchronized關(guān)鍵字當(dāng)成同步鎖時,圍繞這個鎖的一系列操作都和Mark Word有關(guān)。

Mark Word在32位JVM中的長度是32bit,在64位JVM中長度是64bit。

Mark Word在不同的鎖狀態(tài)下存儲的內(nèi)容不同,在32位JVM中是這么存的:

一共32位,兩位用來記錄鎖的信息,1位用來記錄是否是偏向鎖,如果偏向鎖是1的話,那么會分配23位來記錄偏向的線程id,當(dāng)計算過Hash后,意味著會分配25bit來記錄HashCode,那么久沒有空間用來記錄偏向鎖的線程ID了,所以計算過HashCode后就沒法再進(jìn)入偏向鎖。如果進(jìn)入輕量級鎖或者重量級鎖,意味著會用30bit指向指針,那么此時對象頭中就只有兩種信息,鎖標(biāo)志、指向鎖的指針。

其中無鎖和偏向鎖的鎖標(biāo)志位都是01,只是在前面的1bit區(qū)分了這是無鎖狀態(tài)還是偏向鎖狀態(tài)。

JDK1.6以后的版本在處理同步鎖時存在鎖升級的概念,JVM對于同步鎖的處理是從偏向鎖開始的,隨著競爭越來越激烈,處理方式從偏向鎖升級到輕量級鎖,最終升級到重量級鎖。

結(jié)合Mark Word分析鎖升級的流程:

1,當(dāng)沒有被當(dāng)成鎖時,這就是一個普通的對象,Mark Word記錄對象的HashCode,鎖標(biāo)志位是01,是否偏向鎖那一位是0(0則false , 1 則true)。

2,當(dāng)對象被當(dāng)做同步鎖并有一個線程A搶到了鎖時,鎖標(biāo)志位還是01,但是否偏向鎖那一位改成1,前23bit記錄搶到鎖的線程id,表示進(jìn)入偏向鎖狀態(tài)。

3,當(dāng)線程A再次試圖來獲得鎖時,JVM發(fā)現(xiàn)同步鎖對象的標(biāo)志位是01,是否偏向鎖是1,也就是偏向狀態(tài),Mark Word中記錄的線程id就是線程A自己的id,表示線程A已經(jīng)獲得了這個偏向鎖,可以執(zhí)行同步鎖的代碼。

4,當(dāng)線程B試圖獲得這個鎖時,JVM發(fā)現(xiàn)同步鎖處于偏向狀態(tài),但是Mark Word中的線程id記錄的不是B,那么線程B會先用CAS操作試圖獲得鎖,這里的獲得鎖操作是有可能成功的,因為線程A一般不會自動釋放偏向鎖。如果搶鎖成功,就把Mark Word里的線程id改為線程B的id,代表線程B獲得了這個偏向鎖,可以執(zhí)行同步鎖代碼。如果搶鎖失敗,則繼續(xù)執(zhí)行步驟5。

5,偏向鎖狀態(tài)搶鎖失敗,代表當(dāng)前鎖有一定的競爭,偏向鎖將升級為輕量級鎖。JVM會在當(dāng)前線程的線程棧中開辟一塊單獨的空間,里面保存指向?qū)ο箧iMark Word的副本,同時在對象鎖Mark Word中保存指向這片空間的指針。上述兩個保存操作都是CAS操作,如果保存成功,代表線程搶到了同步鎖,就把Mark Word中的鎖標(biāo)志位改成00,可以執(zhí)行同步鎖代碼。如果保存失敗,表示搶鎖失敗,競爭太激烈,繼續(xù)執(zhí)行步驟6。

6,輕量級鎖搶鎖失敗,JVM會使用自旋鎖,自旋鎖不是一個鎖狀態(tài),只是代表不斷的重試,嘗試搶鎖。從JDK1.7開始,自旋鎖默認(rèn)啟用,自旋次數(shù)由JVM決定。如果搶鎖成功則執(zhí)行同步鎖代碼,如果失敗則繼續(xù)執(zhí)行步驟7。

7,自旋鎖重試之后如果搶鎖依然失敗,同步鎖會升級至重量級鎖,鎖標(biāo)志位改為10。在這個狀態(tài)下,未搶到鎖的線程都會被阻塞。

對象頭之指向類的指針

該指針在32位JVM中的長度是32bit,在64位JVM中長度是64bit。

Java對象的類數(shù)據(jù)保存在方法區(qū)。 并不是所有的虛擬機實現(xiàn)都必須在對象數(shù)據(jù)上保留類型指針,換句話說,查找對象的元數(shù)據(jù)信息并不一定要經(jīng)過對象本身。

對象頭之?dāng)?shù)組長度

如果對象是一個Java數(shù)組,那在對象頭中還必須有一塊用于記錄數(shù)組長度的數(shù)據(jù),因為虛擬機可以通過普通Java對象的元數(shù)據(jù)信息確定Java對象的大小,但是如果數(shù)組的長度是不確定的,將無法通過元數(shù)據(jù)中的信息推斷出數(shù)組的大小。

只有數(shù)組對象保存了這部分?jǐn)?shù)據(jù), 該數(shù)據(jù)在32位和64位JVM中長度都是32bit。

實例數(shù)據(jù)

實例數(shù)據(jù)部分是對象真正存儲的有效信息,即我們在程序代碼里面所定義的各種類型的字段內(nèi)容,無論是從父類繼承下來的,還是在子類中定義的字段都必須記錄起來。這部分的存儲順序會受到虛擬機分配策略參數(shù)(-XX:FieldsAllocationStyle參數(shù))和字段在Java源碼中定義順序的影響。HotSpot虛擬機默認(rèn)的分配順序為longs/doubles、ints、shorts/chars、bytes/booleans、oops(OrdinaryObject Pointers,OOPs),從以上默認(rèn)的分配策略中可以看到,相同寬度的字段總是被分配到一起存放,在滿足這個前提條件的情況下,在父類中定義的變量會出現(xiàn)在子類之前。如果HotSpot虛擬機的+XX:CompactFields參數(shù)值為true(默認(rèn)就為true),那子類之中較窄的變量也允許插入父類變量的空隙之中,以節(jié)省出一點點空間。

對齊填充

這并不是必然存在的,也沒有特別的含義,它僅僅起著占位符的作用。由于HotSpot虛擬機的自動內(nèi)存管理系統(tǒng)要求對象起始地址必須是8字節(jié)的整數(shù)倍,換句話說就是任何對象的大小都必須是8字節(jié)的整數(shù)倍。對象頭部分已經(jīng)被精心設(shè)計成正好是8字節(jié)的倍數(shù)(1倍或者2倍),因此,如果對象實例數(shù)據(jù)部分沒有對齊的話,就需要通過對齊填充來補全。

到此這篇關(guān)于JAVA對象分析之偏向鎖、輕量級鎖、重量級鎖升級過程的文章就介紹到這了,更多相關(guān)偏向鎖、輕量級鎖、重量級鎖升級過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 通過jenkins發(fā)布java項目到目標(biāo)主機上的詳細(xì)步驟

    通過jenkins發(fā)布java項目到目標(biāo)主機上的詳細(xì)步驟

    這篇文章主要介紹了通過jenkins發(fā)布java項目到目標(biāo)主機上的詳細(xì)步驟,發(fā)布java項目的步驟很簡單,通過拉取代碼并打包,備份目標(biāo)服務(wù)器上已有的要發(fā)布項目,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-10-10
  • Java實現(xiàn)上傳和下載功能(支持多個文件同時上傳)

    Java實現(xiàn)上傳和下載功能(支持多個文件同時上傳)

    這篇文章主要介紹了Java實現(xiàn)上傳和下載功能,支持多個文件同時上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 帶你盤點Java的五種運算符

    帶你盤點Java的五種運算符

    這篇文章主要介紹了Java基本數(shù)據(jù)類型和運算符,結(jié)合實例形式詳細(xì)分析了java基本數(shù)據(jù)類型、數(shù)據(jù)類型轉(zhuǎn)換、算術(shù)運算符、邏輯運算符等相關(guān)原理與操作技巧,需要的朋友可以參考下
    2021-07-07
  • Java生成由時間組成的訂單號方式

    Java生成由時間組成的訂單號方式

    這篇文章主要介紹了Java生成由時間組成的訂單號方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java如何替換jar中的class文件

    Java如何替換jar中的class文件

    在調(diào)整java代碼過程中會遇到需要改jar包中的class文件的情況,改了如何替換呢?下面小編給大家分享java替換jar中的class文件的操作方法,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • maven安裝配置的實現(xiàn)步驟

    maven安裝配置的實現(xiàn)步驟

    本文主要介紹了maven安裝配置的實現(xiàn)步驟,包括下載和安裝Maven,配置Maven的環(huán)境變量,以及創(chuàng)建Maven項目,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 詳解Java 中程序內(nèi)存的分析

    詳解Java 中程序內(nèi)存的分析

    這篇文章主要介紹了詳解Java 中程序內(nèi)存的分析的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java編程中使用XFire框架調(diào)用WebService程序接口

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

    這篇文章主要介紹了Java編程中使用XFire調(diào)用WebService程序接口的方法,WebService是一種跨編程語言和跨操作系統(tǒng)平臺的遠(yuǎn)程調(diào)用技術(shù),需要的朋友可以參考下
    2015-12-12
  • java如何實現(xiàn)post請求webservice服務(wù)端

    java如何實現(xiàn)post請求webservice服務(wù)端

    這篇文章主要介紹了java如何實現(xiàn)post請求webservice服務(wù)端,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java中的final關(guān)鍵字詳解及實例

    java中的final關(guān)鍵字詳解及實例

    這篇文章主要介紹了 java中的final關(guān)鍵字詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評論

尚义县| 东乡| 四会市| 民和| 逊克县| 皮山县| 大方县| 淮北市| 固始县| 永城市| 十堰市| 盘山县| 商都县| 祥云县| 洪洞县| 探索| 达拉特旗| 明水县| 文化| 西林县| 万安县| 黄陵县| 平湖市| 渝中区| 合肥市| 公主岭市| 曲周县| 西青区| 乐亭县| 砀山县| 临漳县| 南宫市| 邵阳市| 丰台区| 江源县| 余姚市| 海盐县| 仁布县| 汨罗市| 怀化市| 高雄市|