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

Java面試synchronized偏向鎖后hashcode存址

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

前言

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


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

先說結論:

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

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

1、hashcode是啥時候存進對象頭中?

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

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

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

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

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

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

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

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

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

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

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

4、總結

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

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

相關文章

  • 我勸你謹慎使用Spring中的@Scheduled注解

    我勸你謹慎使用Spring中的@Scheduled注解

    這篇文章主要介紹了Spring中的@Scheduled注解使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 一文詳解Mybatis-plus的介紹與使用

    一文詳解Mybatis-plus的介紹與使用

    Mybatis-Plus?是?MyBatis?的一個增強工具,專門針對于傳統(tǒng)MyBatis開發(fā)中sql需要手動進行映射配置繁瑣缺點的一款框架技術。本文將為大家詳細講講Mybatis-plus的介紹與使用,感興趣的可以了解一下
    2022-07-07
  • Java中Thread.join()的使用方法

    Java中Thread.join()的使用方法

    這篇文章主要介紹了Java中Thread.join()的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 流式圖表拒絕增刪改查之kafka核心消費邏輯下篇

    流式圖表拒絕增刪改查之kafka核心消費邏輯下篇

    這篇文章主要為大家介紹了流式圖表拒絕增刪改查之kafka核心消費邏輯講解的下篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • SpringBoot加載配置文件的實現(xiàn)方式總結

    SpringBoot加載配置文件的實現(xiàn)方式總結

    在實際的項目開發(fā)過程中,我們經(jīng)常需要將某些變量從代碼里面抽離出來,放在配置文件里面,以便更加統(tǒng)一、靈活的管理服務配置信息。所以本文將為大家總結一下SpringBoot加載配置文件的常用方式,需要的可以參考一下
    2022-03-03
  • springboot服務正常啟動之后,訪問服務url無響應問題及解決

    springboot服務正常啟動之后,訪問服務url無響應問題及解決

    這篇文章主要介紹了springboot服務正常啟動之后,訪問服務url無響應問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Mybatis?Mapper中多參數(shù)方法不使用@param注解報錯的解決

    Mybatis?Mapper中多參數(shù)方法不使用@param注解報錯的解決

    這篇文章主要介紹了Mybatis?Mapper中多參數(shù)方法不使用@param注解報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • springboot?aop配合反射統(tǒng)一簽名驗證實踐

    springboot?aop配合反射統(tǒng)一簽名驗證實踐

    這篇文章主要介紹了springboot?aop配合反射統(tǒng)一簽名驗證實踐,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • elasticsearch構造Client實現(xiàn)java客戶端調用接口示例分析

    elasticsearch構造Client實現(xiàn)java客戶端調用接口示例分析

    這篇文章主要為大家介紹了elasticsearch構造Client實現(xiàn)java客戶端調用接口示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • mybatis Plus 多表聯(lián)合查詢的實現(xiàn)示例

    mybatis Plus 多表聯(lián)合查詢的實現(xiàn)示例

    這篇文章主要介紹了mybatis Plus 多表聯(lián)合查詢的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09

最新評論