欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java鎖升級(jí)過(guò)程過(guò)程詳解

 更新時(shí)間:2021年08月27日 15:59:51   作者:我要當(dāng)無(wú)敵內(nèi)卷人  
這篇文章主要介紹了Java鎖升級(jí)的實(shí)現(xiàn)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1.說(shuō)到鎖升級(jí)的過(guò)程,我們就得說(shuō)一下對(duì)象頭

對(duì)象頭

java對(duì)象保存在內(nèi)存中,由3個(gè)部分組成:

1. 對(duì)象頭

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

3. 對(duì)齊填充字節(jié)

4. 如果是數(shù)組還包含數(shù)組長(zhǎng)度

對(duì)象頭的存在形式

讓我們先看看圖,主要來(lái)說(shuō)一下 Mark Word

  • markword 8bytes
  • class pointer - 指向?qū)ο笏鶎俚腸lass (一般是4bytes)
  • instance data - 成員變量
  • padding - 8字節(jié)對(duì)齊

Mark Word里都有啥

hashcode

GC

為了讓你們更好理解我先放一張圖

此處,有幾點(diǎn)要注意:

  • 如果對(duì)象沒有重寫hashcode方法,那么默認(rèn)是調(diào)用os::random產(chǎn)生hashcode,可以通過(guò)System.identityHashCode獲取;os::random產(chǎn)生hashcode的規(guī)則為:next_rand = (16807seed) mod (2*31-1),因此可以使用31位存儲(chǔ);另外一旦生成了hashcode,JVM會(huì)將其記錄在markword中;
  • GC年齡采用4位bit存儲(chǔ),最大為15,例如MaxTenuringThreshold參數(shù)默認(rèn)值就是15;
  • 當(dāng)處于輕量級(jí)鎖、重量級(jí)鎖時(shí),記錄的對(duì)象指針,根據(jù)JVM的說(shuō)明,此時(shí)認(rèn)為指針仍然是64位,最低兩位假定為0;當(dāng)處于偏向鎖時(shí),記錄的為獲得偏向鎖的線程指針,該指針也是64位;

這里呢,是講解的鎖升級(jí)所以就重點(diǎn)看一下后兩位,鎖狀態(tài)的判斷就是看后兩位的狀態(tài),無(wú)鎖和偏向鎖是看倒數(shù)第三位的狀態(tài)

接下來(lái)讓我們看看鎖升級(jí)的過(guò)程

專業(yè)版解釋

1、當(dāng)沒有被當(dāng)做鎖的時(shí)候,這就是個(gè)普通對(duì)象,鎖標(biāo)志位為01,是否偏向鎖為0

2、當(dāng)對(duì)象被當(dāng)做同步鎖時(shí),一個(gè)線程A搶到鎖時(shí),鎖標(biāo)志位依然是01,是否偏向鎖為1,前23位記錄A線程的線程ID,此時(shí)鎖升級(jí)為偏向鎖

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)一個(gè)線程B嘗試獲取鎖,JVM發(fā)現(xiàn)當(dāng)前的鎖處于偏向狀態(tài),并且現(xiàn)場(chǎng)ID不是B線程的ID,那么線程B會(huì)先用CAS將線程id改為自己的,這里是有可能成功的,因?yàn)锳線程一般不會(huì)釋放偏向鎖。如果失敗,則執(zhí)行5

5、偏向鎖搶鎖失敗,則說(shuō)明當(dāng)前鎖存在一定的競(jìng)爭(zhēng),偏向鎖就升級(jí)為輕量級(jí)鎖。JVM會(huì)在當(dāng)前線程的現(xiàn)場(chǎng)棧中開辟一塊單獨(dú)的空間,里面保存指向?qū)ο箧iMark Word的指針,同時(shí)在對(duì)象鎖MarkWord中保存指向這片空間的指針。上面的保存都是CAS操作,如果競(jìng)爭(zhēng)成功,代表線程B搶到了鎖,可以執(zhí)行同步代碼。如果搶鎖失敗,則繼續(xù)執(zhí)行6

6、輕量級(jí)鎖搶鎖失敗,則JVM會(huì)使用自旋鎖,自旋鎖并非是一個(gè)鎖,則是一個(gè)循環(huán)操作,不斷的嘗試獲取鎖。從JDK1.7開始,自旋鎖默認(rèn)開啟,自旋次數(shù)由JVM決定。如果搶鎖成功,則執(zhí)行同步代碼;如果搶鎖失敗,則執(zhí)行7

7、自旋鎖重試之后仍然未搶到鎖,同步鎖會(huì)升級(jí)至重量級(jí)鎖,鎖標(biāo)志位改為10,在這個(gè)狀態(tài)下,未搶到鎖的線程都會(huì)被阻塞,由Monitor來(lái)管理,并會(huì)有線程的park與unpark,因?yàn)檫@個(gè)存在用戶態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換,比較消耗資源,故名重量級(jí)鎖

詳情請(qǐng)看:https://blog.csdn.net/wyb_gg/article/details/107518521

我通過(guò)馬士兵老師講的帶味道的栗子大致懂了這個(gè)過(guò)程(菜鳥版理解)

首先呢,小馬去上廁所噗噗噗,但是這個(gè)廁所很特殊,門上是沒有鎖的(無(wú)鎖狀態(tài))

小馬覺得這不太安全啊,于是就想了個(gè)辦法,上廁所噗噗噗的時(shí)候先貼上自己的名字,這樣是不是就不會(huì)遇到尷尬的事(偏向鎖)

但是這樣還是不好,要是方圓百里只有這一個(gè)廁所,翠花和小李都想上廁所怎么辦,這時(shí)候就發(fā)生了鎖競(jìng)爭(zhēng),他們會(huì)通過(guò)一個(gè)叫CAS來(lái)?yè)屵@個(gè)廁所,他們中有可能成功,把自己的名字貼到廁所門上,那如果沒成功呢???

沒成功就會(huì)升級(jí)成輕量級(jí)鎖,jvm會(huì)在當(dāng)前線程的現(xiàn)場(chǎng)棧開辟一塊空間,讓翠花和小李在那里轉(zhuǎn)圈圈的搶著誰(shuí)上廁所(也叫自旋)也是通過(guò)CAS來(lái)實(shí)現(xiàn)的, 自旋的次數(shù)是10次以上,或者CPU核數(shù)的一半(JDK1.7開始,自旋鎖默認(rèn)開啟,自旋次數(shù)由JVM決定) 那如果又失敗了呢! 倆孩子快拉褲兜子了?。。。。。?/p>

這時(shí)候就會(huì)升級(jí)成重量級(jí)鎖,重量級(jí)這個(gè)詞一聽就不一般,JVM說(shuō):我頭快禿了,干不了了。所以,我們的重量級(jí)鎖是os老大哥管理的

注:

1.CAS中呢,底層是lock cmpxchg(大家不會(huì)的話可以自行百度)CAS也有很多問(wèn)題:就像ABA啥的,這里就不多bb了

2.那么有的小小猿就會(huì)問(wèn)了,啥時(shí)候變成匿名對(duì)象呢?是4s以后才會(huì)加上偏向鎖,變成匿名對(duì)象滴,那么咋取消呢,-XX:-UseBiasedLocking 或者去sleep

這就是我對(duì)鎖升級(jí)的理解,如果有錯(cuò)誤的話,還望指正

總結(jié)

本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 詳解JVM系列之對(duì)象的鎖狀態(tài)和同步

    詳解JVM系列之對(duì)象的鎖狀態(tài)和同步

    鎖和同步是java多線程編程中非常常見的使用場(chǎng)景。為了鎖定多線程共享的對(duì)象,Java需要提供一定的機(jī)制來(lái)實(shí)現(xiàn)共享對(duì)象的鎖定。當(dāng)?shù)诙€(gè)線程進(jìn)入同一個(gè)區(qū)域的時(shí)候,必須等待第一個(gè)線程解鎖該對(duì)象。JVM是怎么做到的呢?快來(lái)一起看看吧。
    2021-06-06
  • Java實(shí)現(xiàn)添加、驗(yàn)證PDF數(shù)字簽名的方法示例

    Java實(shí)現(xiàn)添加、驗(yàn)證PDF數(shù)字簽名的方法示例

    在設(shè)置文檔內(nèi)容保護(hù)的方法中,除了對(duì)文檔加密、添加水印外,應(yīng)用數(shù)字簽名也是一種有效防偽手段。本文就使用Java實(shí)現(xiàn)添加、驗(yàn)證PDF數(shù)字簽名,感興趣的可以了解一下
    2021-07-07
  • Java中的set集合是什么意思

    Java中的set集合是什么意思

    這篇文章主要介紹了Java中的set集合是什么意思,詳細(xì)地講解一下Collection集合中的另外一個(gè)分支——Set系列集合,需要的朋友可以參考下
    2022-05-05
  • Java管道流實(shí)現(xiàn)線程間通信過(guò)程解析

    Java管道流實(shí)現(xiàn)線程間通信過(guò)程解析

    這篇文章主要介紹了Java管道流實(shí)現(xiàn)線程間通信過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 使用Spring Cache設(shè)置緩存條件操作

    使用Spring Cache設(shè)置緩存條件操作

    這篇文章主要介紹了使用Spring Cache設(shè)置緩存條件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • spring是如何實(shí)現(xiàn)聲明式事務(wù)的

    spring是如何實(shí)現(xiàn)聲明式事務(wù)的

    這篇文章主要介紹了spring是如何實(shí)現(xiàn)聲明式事務(wù)的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • springboot jta atomikos實(shí)現(xiàn)分布式事物管理

    springboot jta atomikos實(shí)現(xiàn)分布式事物管理

    這篇文章主要介紹了springboot jta atomikos實(shí)現(xiàn)分布式事物管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Maven環(huán)境安裝配置和新建項(xiàng)目介紹

    Maven環(huán)境安裝配置和新建項(xiàng)目介紹

    這篇文章介紹了Maven環(huán)境安裝配置和新建項(xiàng)目介紹,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Spring Boot集成mongodb數(shù)據(jù)庫(kù)過(guò)程解析

    Spring Boot集成mongodb數(shù)據(jù)庫(kù)過(guò)程解析

    這篇文章主要介紹了Spring Boot集成mongodb數(shù)據(jù)庫(kù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java面試之高級(jí)特性基礎(chǔ)總結(jié)

    Java面試之高級(jí)特性基礎(chǔ)總結(jié)

    這篇文章主要為大家詳細(xì)介紹了10個(gè)Java高級(jí)特性基礎(chǔ)相關(guān)的問(wèn)題,也是大家面試中常常會(huì)遇到的問(wèn)題。文中的示例代講解詳細(xì),感興趣的可以了解一下
    2023-01-01

最新評(píng)論