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