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

JAVA對(duì)象分析之偏向鎖、輕量級(jí)鎖、重量級(jí)鎖升級(jí)過(guò)程

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

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

對(duì)象頭(Header)

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

對(duì)齊填充(Padding)。

對(duì)象頭

HotSpot虛擬機(jī)(后面沒(méi)有說(shuō)明的話默認(rèn)是這個(gè)虛擬機(jī))對(duì)象頭包括三部分:

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

對(duì)象頭之Mark Word

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

Mark Word在32位JVM中的長(zhǎng)度是32bit,在64位JVM中長(zhǎng)度是64bit。

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

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

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

JDK1.6以后的版本在處理同步鎖時(shí)存在鎖升級(jí)的概念,JVM對(duì)于同步鎖的處理是從偏向鎖開(kāi)始的,隨著競(jìng)爭(zhēng)越來(lái)越激烈,處理方式從偏向鎖升級(jí)到輕量級(jí)鎖,最終升級(jí)到重量級(jí)鎖。

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

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

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

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

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

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

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

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

對(duì)象頭之指向類的指針

該指針在32位JVM中的長(zhǎng)度是32bit,在64位JVM中長(zhǎng)度是64bit。

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

對(duì)象頭之?dāng)?shù)組長(zhǎng)度

如果對(duì)象是一個(gè)Java數(shù)組,那在對(duì)象頭中還必須有一塊用于記錄數(shù)組長(zhǎng)度的數(shù)據(jù),因?yàn)樘摂M機(jī)可以通過(guò)普通Java對(duì)象的元數(shù)據(jù)信息確定Java對(duì)象的大小,但是如果數(shù)組的長(zhǎng)度是不確定的,將無(wú)法通過(guò)元數(shù)據(jù)中的信息推斷出數(shù)組的大小。

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

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

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

對(duì)齊填充

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

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

相關(guān)文章

  • Kafka使用Java客戶端進(jìn)行訪問(wèn)的示例代碼

    Kafka使用Java客戶端進(jìn)行訪問(wèn)的示例代碼

    本篇文章主要介紹了Kafka使用Java客戶端進(jìn)行訪問(wèn)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • java中有無(wú)參數(shù)和返回值的方法詳解

    java中有無(wú)參數(shù)和返回值的方法詳解

    這篇文章主要介紹了java中有無(wú)參數(shù)和返回值的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • IDEA集成Docker實(shí)現(xiàn)快捷部署的操作步驟

    IDEA集成Docker實(shí)現(xiàn)快捷部署的操作步驟

    這篇文章主要介紹了IDEA集成Docker實(shí)現(xiàn)快捷部署的操作步驟,通過(guò)靈活利用這一功能,開(kāi)發(fā)人員可以更快速地開(kāi)發(fā)、調(diào)試和部署應(yīng)用程序,從而提高開(kāi)發(fā)工作的效率和質(zhì)量,需要的朋友可以參考下
    2024-06-06
  • 實(shí)例講解Java批量插入、更新數(shù)據(jù)

    實(shí)例講解Java批量插入、更新數(shù)據(jù)

    這片文章介紹了一個(gè)Java批量添加數(shù)據(jù),多個(gè)字段同時(shí)添加多條數(shù)據(jù)具體實(shí)例,面向的是Oracle數(shù)據(jù)庫(kù),需要的朋友可以參考下
    2015-07-07
  • Java中常用數(shù)據(jù)類型的輸入輸出詳解

    Java中常用數(shù)據(jù)類型的輸入輸出詳解

    本文主要介紹了Java中幾個(gè)常用的數(shù)據(jù)類型是如何輸入和輸出的,例如:Char型、int型、double型、數(shù)組、字符串等,對(duì)我們學(xué)習(xí)java有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)
    2021-12-12
  • 深入淺析Mybatis的缺陷問(wèn)題

    深入淺析Mybatis的缺陷問(wèn)題

    Mybatis是業(yè)界非常流行的持久層框架,輕量級(jí)、易用,在金融IT領(lǐng)域完全是領(lǐng)軍地位,比Hibernate更受歡迎,優(yōu)勢(shì)非常多,也是非常值得我們學(xué)習(xí)的。這篇文章主要介紹了Mybatis的缺陷問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • java接口使用默認(rèn)方法的講解

    java接口使用默認(rèn)方法的講解

    在本篇文章里小編給大家整理了一篇關(guān)于java接口使用默認(rèn)方法的講解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2021-04-04
  • Mybatis逆向生成使用擴(kuò)展類的實(shí)例代碼詳解

    Mybatis逆向生成使用擴(kuò)展類的實(shí)例代碼詳解

    這篇文章主要介紹了Mybatis逆向生成使用擴(kuò)展類的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-05-05
  • Jenkins+Git+Maven自動(dòng)化部署配置詳解

    Jenkins+Git+Maven自動(dòng)化部署配置詳解

    本文主要介紹了Jenkins+Git+Maven自動(dòng)化部署配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)的實(shí)例代碼

    Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)的實(shí)例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論