這篇文章主要講解了如何實現(xiàn)Java鎖升級,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。
創(chuàng)新互聯(lián)建站成都網(wǎng)站建設(shè)按需定制網(wǎng)站,是成都網(wǎng)站營銷公司,為砂巖浮雕提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計、前端HTML5制作、后臺程序開發(fā)等。成都網(wǎng)站改版熱線:028-86922220
對象內(nèi)存布局
Java對象在內(nèi)存中存儲的布局可以分為3塊區(qū)域: 對象頭、實例數(shù)據(jù)、對齊填充。
對象頭,分為兩個部分,第一個部分存儲對象自身的運行時數(shù)據(jù),又稱為Mark Word
,32位虛擬機占32bit,64位虛擬機占64bit。如圖所示,不同鎖狀態(tài)下,Mark Word的結(jié)構(gòu),理解下面要介紹的各種鎖,和鎖升級過程,都需要先充分了解Mark Word
的結(jié)構(gòu)。
第二部分是類型指針,指向類元數(shù)據(jù)指針,虛擬機通過此指針,確定該對象屬于那個類的實例。
輕量級鎖
輕量級鎖是相對于重量級鎖(Synchrnoized
)而言的,本意是在沒有多線程競爭的前提下,減少傳統(tǒng)的重量級鎖使用操作系統(tǒng)互斥量產(chǎn)生的性能消耗。
輕量級鎖的獲取
線程進入同步塊時,如果此同步對象沒有被鎖定(即鎖標志位為01
,是否為偏向鎖為0
),虛擬機在當前線程的棧幀中建立一個名為鎖記錄(Lock Record)的空間,用于存儲鎖對象目前的一個Mark Word
的copy
然后虛擬機使用CAS操作,嘗試將Mark World
更新為指向Lock Record
的指針,如果更新成功,那么線程擁有了該對象的鎖,并且將鎖標志位置位00
,如圖所示
一旦有兩條以上的線程搶占該鎖,輕量級鎖會升級為重量級鎖。鎖標志位置為10
,Mark Word存儲的就是指向重量級鎖的指針
輕量級鎖釋
偏向鎖
引入偏向鎖的目的是在沒有多線程競爭的前提下,進一步減少線程同步的性能消耗。
偏向鎖的獲取
開啟偏向鎖模式后,鎖第一次被線程獲取的時候,虛擬機會把對象頭中是否為偏向鎖
的標志位設(shè)位0
,同時使用CAS操作把獲取到這個鎖的線程的ID記錄在對象的Mark Word之中。
當有另外一個線程去嘗試獲取這個鎖時, 偏向模式就宣告結(jié)束。 根據(jù)鎖對象目前是否處于被鎖定的狀態(tài), 撤銷偏向( Revoke Bias) 后恢復(fù)到未鎖定( 標志位為“01”)或輕量級鎖定( 標志位為“00”) 的狀態(tài)
偏向鎖的釋放
偏向鎖,并沒有顯式的鎖釋放過程,主要依靠鎖的批量再偏向(Bulk Rebias)機制實現(xiàn)鎖釋放。
該機制的主要工作原理如下:
整個鎖升級過程
看完上述內(nèi)容,是不是對如何實現(xiàn)Java鎖升級有進一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。