您好,登錄后才能下訂單哦!
這篇文章主要講解了如何實現Java鎖升級,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
對象內存布局
Java對象在內存中存儲的布局可以分為3塊區域: 對象頭、實例數據、對齊填充。
對象頭,分為兩個部分,第一個部分存儲對象自身的運行時數據,又稱為Mark Word
,32位虛擬機占32bit,64位虛擬機占64bit。如圖所示,不同鎖狀態下,Mark Word的結構,理解下面要介紹的各種鎖,和鎖升級過程,都需要先充分了解Mark Word
的結構。
第二部分是類型指針,指向類元數據指針,虛擬機通過此指針,確定該對象屬于那個類的實例。
輕量級鎖
輕量級鎖是相對于重量級鎖(Synchrnoized
)而言的,本意是在沒有多線程競爭的前提下,減少傳統的重量級鎖使用操作系統互斥量產生的性能消耗。
輕量級鎖的獲取
線程進入同步塊時,如果此同步對象沒有被鎖定(即鎖標志位為01
,是否為偏向鎖為0
),虛擬機在當前線程的棧幀中建立一個名為鎖記錄(Lock Record)的空間,用于存儲鎖對象目前的一個Mark Word
的copy
然后虛擬機使用CAS操作,嘗試將Mark World
更新為指向Lock Record
的指針,如果更新成功,那么線程擁有了該對象的鎖,并且將鎖標志位置位00
,如圖所示
一旦有兩條以上的線程搶占該鎖,輕量級鎖會升級為重量級鎖。鎖標志位置為10
,Mark Word存儲的就是指向重量級鎖的指針
輕量級鎖釋
偏向鎖
引入偏向鎖的目的是在沒有多線程競爭的前提下,進一步減少線程同步的性能消耗。
偏向鎖的獲取
開啟偏向鎖模式后,鎖第一次被線程獲取的時候,虛擬機會把對象頭中是否為偏向鎖
的標志位設位0
,同時使用CAS操作把獲取到這個鎖的線程的ID記錄在對象的Mark Word之中。
當有另外一個線程去嘗試獲取這個鎖時, 偏向模式就宣告結束。 根據鎖對象目前是否處于被鎖定的狀態, 撤銷偏向( Revoke Bias) 后恢復到未鎖定( 標志位為“01”)或輕量級鎖定( 標志位為“00”) 的狀態
偏向鎖的釋放
偏向鎖,并沒有顯式的鎖釋放過程,主要依靠鎖的批量再偏向(Bulk Rebias)機制實現鎖釋放。
該機制的主要工作原理如下:
整個鎖升級過程
看完上述內容,是不是對如何實現Java鎖升級有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。