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

java鎖升級過程過程詳解

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

1.說到鎖升級的過程,我們就得說一下對象頭

對象頭

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

1. 對象頭

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

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

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

對象頭的存在形式

讓我們先看看圖,主要來說一下 Mark Word

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

Mark Word里都有啥

hashcode

GC

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

此處,有幾點要注意:

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

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

接下來讓我們看看鎖升級的過程

專業(yè)版解釋

1、當沒有被當做鎖的時候,這就是個普通對象,鎖標志位為01,是否偏向鎖為0

2、當對象被當做同步鎖時,一個線程A搶到鎖時,鎖標志位依然是01,是否偏向鎖為1,前23位記錄A線程的線程ID,此時鎖升級為偏向鎖

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

4、當一個線程B嘗試獲取鎖,JVM發(fā)現(xiàn)當前的鎖處于偏向狀態(tài),并且現(xiàn)場ID不是B線程的ID,那么線程B會先用CAS將線程id改為自己的,這里是有可能成功的,因為A線程一般不會釋放偏向鎖。如果失敗,則執(zhí)行5

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

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

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

詳情請看:https://blog.csdn.net/wyb_gg/article/details/107518521

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

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

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

但是這樣還是不好,要是方圓百里只有這一個廁所,翠花和小李都想上廁所怎么辦,這時候就發(fā)生了鎖競爭,他們會通過一個叫CAS來搶這個廁所,他們中有可能成功,把自己的名字貼到廁所門上,那如果沒成功呢???

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

這時候就會升級成重量級鎖,重量級這個詞一聽就不一般,JVM說:我頭快禿了,干不了了。所以,我們的重量級鎖是os老大哥管理的

注:

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

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

這就是我對鎖升級的理解,如果有錯誤的話,還望指正

總結(jié)

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

相關(guān)文章

  • Java的Volatile實例用法及講解

    Java的Volatile實例用法及講解

    在本篇文章里小編給大家整理了關(guān)于Java的Volatile知識點相關(guān)內(nèi)容,有需要的朋友們可以跟著學習下。
    2019-09-09
  • Java實現(xiàn)學生管理系統(tǒng)

    Java實現(xiàn)學生管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)學生管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java使用鎖解決銀行取錢問題實例分析

    Java使用鎖解決銀行取錢問題實例分析

    這篇文章主要介紹了Java使用鎖解決銀行取錢問題,結(jié)合實例形式分析了java線程同步與鎖機制相關(guān)原理及操作注意事項,需要的朋友可以參考下
    2019-08-08
  • Java括號匹配舉例詳解

    Java括號匹配舉例詳解

    看到大家對括號匹配問題很感興趣,下面這篇文章主要給大家介紹了關(guān)于Java括號匹配的相關(guān)資料,括號匹配是一種常見的編程問題,涉及到在給定的字符串中判斷括號是否匹配,需要的朋友可以參考下
    2023-10-10
  • 一文掌握Springboot集成RabbitMQ的方法

    一文掌握Springboot集成RabbitMQ的方法

    RabbitMQ是開源的消息隊列服務(wù)器,實現(xiàn)了AMQP高級消息隊列協(xié)議標準,AMQP?是一種應(yīng)用層協(xié)議,為面向消息的中間件設(shè)計,基于此協(xié)議的客戶端與消息中間件可傳遞消息,并不受產(chǎn)品、開發(fā)語言等條件的限制,這篇文章主要介紹了Springboot集成RabbitMQ的過程,需要的朋友可以參考下
    2024-04-04
  • JVM內(nèi)存模型/內(nèi)存空間:運行時數(shù)據(jù)區(qū)

    JVM內(nèi)存模型/內(nèi)存空間:運行時數(shù)據(jù)區(qū)

    這篇文章主要介紹了JVM內(nèi)存模型/內(nèi)存空間的相關(guān)資料,幫助大家更好的理解和學習Java虛擬機,感興趣的朋友可以了解詳細,希望能夠給你帶來幫助
    2021-08-08
  • springboot自帶線程池ThreadPoolTaskExecutor使用

    springboot自帶線程池ThreadPoolTaskExecutor使用

    本文主要介紹了springboot自帶線程池ThreadPoolTaskExecutor使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Java版C語言版簡單使用靜態(tài)語言實現(xiàn)動態(tài)數(shù)組的方法

    Java版C語言版簡單使用靜態(tài)語言實現(xiàn)動態(tài)數(shù)組的方法

    本文給大家分享java版和C語言版簡單使用靜態(tài)語言實現(xiàn)動態(tài)數(shù)組的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-10-10
  • Java新手教程之ArrayList的基本使用

    Java新手教程之ArrayList的基本使用

    ArrayList就是傳說中的動態(tài)數(shù)組,用MSDN中的說法,就是Array的復雜版本,這篇文章主要給大家介紹了關(guān)于Java新手教程之ArrayList基本使用的相關(guān)資料
    2021-06-06
  • springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實現(xiàn)過程

    springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實現(xiàn)過程

    這篇文章主要介紹了springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實現(xiàn)過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01

最新評論