亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現Java鎖升級

發布時間:2020-07-23 17:04:27 來源:億速云 閱讀:197 作者:小豬 欄目:編程語言

這篇文章主要講解了如何實現Java鎖升級,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

對象內存布局

Java對象在內存中存儲的布局可以分為3塊區域: 對象頭、實例數據、對齊填充。

對象頭,分為兩個部分,第一個部分存儲對象自身的運行時數據,又稱為Mark Word,32位虛擬機占32bit,64位虛擬機占64bit。如圖所示,不同鎖狀態下,Mark Word的結構,理解下面要介紹的各種鎖,和鎖升級過程,都需要先充分了解Mark Word的結構。

第二部分是類型指針,指向類元數據指針,虛擬機通過此指針,確定該對象屬于那個類的實例。

如何實現Java鎖升級

輕量級鎖

輕量級鎖是相對于重量級鎖(Synchrnoized)而言的,本意是在沒有多線程競爭的前提下,減少傳統的重量級鎖使用操作系統互斥量產生的性能消耗。

輕量級鎖的獲取

線程進入同步塊時,如果此同步對象沒有被鎖定(即鎖標志位為01,是否為偏向鎖為0),虛擬機在當前線程的棧幀中建立一個名為鎖記錄(Lock Record)的空間,用于存儲鎖對象目前的一個Mark Word的copy

如何實現Java鎖升級

然后虛擬機使用CAS操作,嘗試將Mark World更新為指向Lock Record的指針,如果更新成功,那么線程擁有了該對象的鎖,并且將鎖標志位置位00,如圖所示

如何實現Java鎖升級

一旦有兩條以上的線程搶占該鎖,輕量級鎖會升級為重量級鎖。鎖標志位置為10,Mark Word存儲的就是指向重量級鎖的指針

輕量級鎖釋

  • 放如果對象的Mark Word仍然指向著線程的鎖記錄, 那就用CAS操作把對象當前的Mark Word和線程中復制的Displaced Mark Word替換回來, 如果替換成功, 整個同步過程就完成了。
  • 如果替換失敗, 說明有其他線程嘗試過獲取該鎖,輕量級鎖膨脹為重量級鎖,那就要在釋放鎖的同時, 喚醒被掛起的線程。

偏向鎖

引入偏向鎖的目的是在沒有多線程競爭的前提下,進一步減少線程同步的性能消耗。

偏向鎖的獲取

開啟偏向鎖模式后,鎖第一次被線程獲取的時候,虛擬機會把對象頭中是否為偏向鎖的標志位設位0,同時使用CAS操作把獲取到這個鎖的線程的ID記錄在對象的Mark Word之中。

當有另外一個線程去嘗試獲取這個鎖時, 偏向模式就宣告結束。 根據鎖對象目前是否處于被鎖定的狀態, 撤銷偏向( Revoke Bias) 后恢復到未鎖定( 標志位為“01”)或輕量級鎖定( 標志位為“00”) 的狀態

偏向鎖的釋放

偏向鎖,并沒有顯式的鎖釋放過程,主要依靠鎖的批量再偏向(Bulk Rebias)機制實現鎖釋放。

該機制的主要工作原理如下:

  • 引入一個概念 epoch, 其本質是一個時間戳 , 代表了偏向鎖的有效性,從前文描述的對象頭結構中可以看到, epoch 存儲在可偏向對象的 MarkWord 中。
  • 除了對象中的 epoch, 對象所屬的類 class 信息中, 也會保存一個 epoch 值,每當遇到一個全局安全點時, 如果要對 class 進行批量再偏向, 則首先對 class 中保存的 epoch 進行增加操作, 得到一個新的 epoch_new
  • 然后掃描所有持有 class 實例的線程棧,根據線程棧的信息判斷出該線程是否鎖定了該對象, 僅將epoch_new 的值賦給被鎖定的對象中。
  • 退出安全點后, 當有線程需要嘗試獲取偏向鎖時, 直接檢查 class中存儲的 epoch 值是否與目標對象中存儲的 epoch 值相等,如果不相等, 則說明該對象的偏向鎖已經無效了, 可以嘗試對此對象重新進行偏向操作。
     

整個鎖升級過程

如何實現Java鎖升級

看完上述內容,是不是對如何實現Java鎖升級有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

林甸县| 汤阴县| 桐庐县| 济宁市| 高青县| 宿迁市| 莫力| 平湖市| 正镶白旗| 镇雄县| 乡城县| 望江县| 五指山市| 金门县| 江达县| 泸水县| 从化市| 白朗县| 高唐县| 枣庄市| 晋宁县| 达拉特旗| 东宁县| 大渡口区| 专栏| 咸丰县| 达拉特旗| 微山县| 邵东县| 拉萨市| 紫云| 防城港市| 东乡族自治县| 额济纳旗| 延安市| 天长市| 南华县| 卢龙县| 恩平市| 怀来县| 买车|