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

Java面試synchronized偏向鎖后hashcode存址

 更新時(shí)間:2022年05月24日 15:10:57   作者:豬哥66  
這篇文章主要為大家介紹了Java面試中synchronized偏向鎖后hashcode存址詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

今天的文章從下面這張圖片開始,這張圖片Java開發(fā)們應(yīng)該很熟悉了


我們都知道無鎖狀態(tài)是對(duì)象頭是有位置存儲(chǔ)hashcode的,而變?yōu)槠蜴i狀態(tài)是沒有位置存儲(chǔ)hashcode的,今天我們來通過實(shí)現(xiàn)驗(yàn)證這個(gè)問題:當(dāng)鎖狀態(tài)為偏向鎖的時(shí)候,hashcode存到哪里去了?

先說結(jié)論:

  • jdk8偏向鎖是默認(rèn)開啟,但是是有延時(shí)的
    可通過參數(shù): -XX:BiasedLockingStartupDelay=0關(guān)閉延時(shí)。
  • hashcode是懶加載,在調(diào)用hashCode方法后才會(huì)保存在對(duì)象頭中。
  • 當(dāng)對(duì)象頭中沒有hashcode時(shí),對(duì)象頭鎖的狀態(tài)是 可偏向( biasable,101,且無線程id)。
  • 如果在同步代碼塊之前調(diào)用hashCode方法,則對(duì)象頭中會(huì)有hashcode,且鎖狀態(tài)是 不可偏向(0 01),這時(shí)候再執(zhí)行同步代碼塊,鎖直接是 輕量級(jí)鎖(thin lock,00)。

如果是在同步代碼塊中執(zhí)行hashcode,則鎖是從 偏向鎖 直接膨脹為 重量級(jí)鎖。

1、hashcode是啥時(shí)候存進(jìn)對(duì)象頭中?

根據(jù)下圖我們可知,hashcode并不是對(duì)象實(shí)例化后就創(chuàng)建,而是在調(diào)用默認(rèn)的hasCode方法時(shí)才會(huì)放進(jìn)對(duì)象頭。

第一次打印的對(duì)象頭中我們發(fā)現(xiàn)對(duì)象頭中mark word值為16進(jìn)制的5,轉(zhuǎn)為2進(jìn)制就是101,且后面的狀態(tài)顯示為biasable,也就是可偏向,注意區(qū)分可偏向和已偏向:可偏向表示還么有synchronized鎖,已偏向表示有線程訪問鎖。

第二次打印對(duì)象頭中已經(jīng)存在hashcode,value為0x00000039a054a501,轉(zhuǎn)換為2進(jìn)制為:11100110100000010101001010010100000001,最后三位也就是0 01,這就表示不可偏向,也就說當(dāng)出現(xiàn)synchronized鎖不會(huì)進(jìn)行偏向,真是如此嗎?我們驗(yàn)證一下!

2、存在hashcode后,出現(xiàn)synchronized會(huì)是什么鎖?

根據(jù)下圖我們可以清晰的看到,當(dāng)已存在hashcode再執(zhí)行同步代碼,則會(huì)直接進(jìn)入輕量級(jí)鎖,原因還是上面的結(jié)論,有hashcode后將鎖設(shè)置為 不可偏向,那肯定就直接上輕量級(jí)鎖咯。

3、如果鎖狀態(tài)是 已偏向,再計(jì)算hashcode會(huì)怎樣?

前面兩種情況鎖狀態(tài)都是 可偏向 狀態(tài),如果此時(shí)鎖狀態(tài)是 已經(jīng)進(jìn)入偏向狀態(tài)呢?是會(huì)進(jìn)行鎖升級(jí)嘛?

根據(jù)下圖我們可以看到,當(dāng)hashCode方法處于synchronized代碼塊中時(shí),鎖直接升級(jí)為重量級(jí)鎖。

至于為什么直接升級(jí)為重量級(jí)鎖而不是輕量級(jí)鎖,這個(gè)原因不得而知。

豬哥猜想可能無線程競(jìng)爭(zhēng)狀態(tài)下,偏向鎖升級(jí)為重量級(jí)鎖消耗的資源比輕量級(jí)鎖消耗的資源少。

同時(shí)歡迎知道原因的同學(xué)能夠留言告知,也歡迎大家說出自己的猜想?沒準(zhǔn)以后會(huì)根據(jù)你的方案優(yōu)化呢!

4、總結(jié)

  • jdk8偏向鎖是默認(rèn)開啟,但是是有延時(shí)的,可通過參數(shù): -XX:BiasedLockingStartupDelay=0關(guān)閉延時(shí)。
  • hashcode是懶加載,在調(diào)用hashCode方法后才會(huì)保存在對(duì)象頭中。
  • 當(dāng)對(duì)象頭中沒有hashcode時(shí),對(duì)象頭鎖的狀態(tài)是 可偏向( biasable,101,且無線程id)。
  • 如果在同步代碼塊之前調(diào)用hashCode方法,則對(duì)象頭中會(huì)有hashcode,且鎖狀態(tài)是 不可偏向(0 01),這時(shí)候再執(zhí)行同步代碼塊,鎖直接是 輕量級(jí)鎖(thin lock,00)。
  • 如果是在同步代碼塊中執(zhí)行hashcode,則鎖是從 偏向鎖 直接膨脹為 重量級(jí)鎖。

以上就是Java面試synchronized偏向鎖后hashcode存址的詳細(xì)內(nèi)容,更多關(guān)于java 偏向鎖hashcode存址的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java中使用dom4j解析XML文件的方法教程

    java中使用dom4j解析XML文件的方法教程

    在最近的開發(fā)中用到了dom4j來解析xml文件,所以便有了這篇文章,本文主要給大家介紹了關(guān)于java中使用dom4j解析XML文件的方法教程,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • JPA之EntityManager踩坑及解決:更改PersistenceContext

    JPA之EntityManager踩坑及解決:更改PersistenceContext

    這篇文章主要介紹了JPA之EntityManager踩坑及解決:更改PersistenceContext方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 解讀Integer類的parseInt和valueOf的區(qū)別

    解讀Integer類的parseInt和valueOf的區(qū)別

    這篇文章主要介紹了解讀Integer類的parseInt和valueOf的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • SpringBoot基于自定義注解實(shí)現(xiàn)切面編程

    SpringBoot基于自定義注解實(shí)現(xiàn)切面編程

    這篇文章主要介紹了SpringBoot基于自定義注解實(shí)現(xiàn)切面編程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • SpringBoot數(shù)據(jù)校驗(yàn)及多環(huán)境配置的問題詳解

    SpringBoot數(shù)據(jù)校驗(yàn)及多環(huán)境配置的問題詳解

    這篇文章主要介紹了SpringBoot數(shù)據(jù)校驗(yàn)及多環(huán)境配置,本文以SpringBoot-02-Config 項(xiàng)目為例,給大家詳細(xì)介紹,需要的朋友可以參考下
    2021-09-09
  • JPA如何使用entityManager執(zhí)行SQL并指定返回類型

    JPA如何使用entityManager執(zhí)行SQL并指定返回類型

    這篇文章主要介紹了JPA使用entityManager執(zhí)行SQL并指定返回類型的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 如何在Mac上安裝并配置JDK環(huán)境變量詳細(xì)步驟

    如何在Mac上安裝并配置JDK環(huán)境變量詳細(xì)步驟

    這篇文章主要介紹了如何在Mac上安裝并配置JDK環(huán)境變量詳細(xì)步驟,包括下載JDK、安裝JDK、配置環(huán)境變量、驗(yàn)證JDK配置以及可選地設(shè)置PowerShell為默認(rèn)終端,需要的朋友可以參考下
    2025-04-04
  • Java中浮點(diǎn)數(shù)精度問題的解決方法

    Java中浮點(diǎn)數(shù)精度問題的解決方法

    這篇文章給大家介紹了Java中浮點(diǎn)數(shù)精度問題的解決方法,本文給大家介紹的非常詳細(xì),有問題描述有原因分析,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-10-10
  • MyBatis攔截器原理探究

    MyBatis攔截器原理探究

    MyBatis提供了一種插件(plugin)的功能,雖然叫做插件,但其實(shí)這是攔截器功能.這篇文章主要介紹了MyBatis攔截器原理探究,需要的朋友可以參考下
    2018-02-02
  • Java Runnable線程傳參,實(shí)現(xiàn)讓run訪問參數(shù)

    Java Runnable線程傳參,實(shí)現(xiàn)讓run訪問參數(shù)

    這篇文章主要介紹了Java Runnable線程傳參,實(shí)現(xiàn)讓run訪問參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論

长武县| 修文县| 汝城县| 交口县| 连云港市| 望城县| 中西区| 焦作市| 甘泉县| 石楼县| 杂多县| 延寿县| 鹤岗市| 石河子市| 广宗县| 宾川县| 德昌县| 夏邑县| 西平县| 陆丰市| 会同县| 焦作市| 斗六市| 灵台县| 金塔县| 南平市| 新巴尔虎右旗| 陈巴尔虎旗| 济源市| 四子王旗| 平果县| 行唐县| 通许县| 巴彦淖尔市| 铜梁县| 山阳县| 鄄城县| 江城| 蒲城县| 松桃| 襄城县|