鎖升級(jí)

對(duì)象元信息

在JVM當(dāng)中,一個(gè)Java對(duì)象的內(nèi)存主要有三塊:

對(duì)象頭,對(duì)象頭包含兩部分?jǐn)?shù)據(jù),分別是Mark word和類型指針(Kclass pointer)。
實(shí)例數(shù)據(jù),就是我們?cè)陬惍?dāng)中定義的各種數(shù)據(jù)。
對(duì)齊填充,JVM在實(shí)現(xiàn)的時(shí)候要求每一個(gè)對(duì)象所占有的內(nèi)存大小都需要是8字節(jié)的整數(shù)倍,如果一個(gè)對(duì)象的數(shù)據(jù)所占有的內(nèi)存大小不夠8字節(jié)的整數(shù)倍,那就需要進(jìn)行填充,補(bǔ)齊到8字節(jié),比如說(shuō)如果一個(gè)對(duì)象站60字節(jié),那么最終會(huì)填充到64字節(jié)。

而與我們要談到的synchronized鎖升級(jí)原理密切相關(guān)的是Mark word,這個(gè)字段主要是存儲(chǔ)對(duì)象運(yùn)行時(shí)的數(shù)據(jù),比如說(shuō)對(duì)象的Hashcode、GC的分代年齡、持有鎖的線程等等。而Kclass pointer主要是用于指向?qū)ο蟮念悾饕潜硎具@個(gè)對(duì)象是屬于哪一個(gè)類,主要是尋找類的元數(shù)據(jù)。
在32位Java虛擬機(jī)當(dāng)中Mark word有4個(gè)字節(jié)一共32個(gè)比特位,其內(nèi)容如下:


image.png

我們?cè)谑褂胹ynchronized時(shí),如果我們是將synchronized用在同步代碼塊,我們需要一個(gè)鎖對(duì)象。對(duì)于這個(gè)鎖對(duì)象來(lái)說(shuō)一開(kāi)始還沒(méi)有線程執(zhí)行到同步代碼塊時(shí),這個(gè)4個(gè)字節(jié)的內(nèi)容如上圖所示,其中有25個(gè)比特用來(lái)存儲(chǔ)哈希值,4個(gè)比特用來(lái)存儲(chǔ)垃圾回收的分代年齡,剩下三個(gè)比特其中第一個(gè)用來(lái)表示當(dāng)前的鎖狀態(tài)是否為偏向鎖,最后的兩個(gè)比特表示當(dāng)前的鎖是哪一種狀態(tài):

如果最后三個(gè)比特是:001,則說(shuō)明鎖狀態(tài)是沒(méi)有鎖。
如果最后三個(gè)比特是:101,則說(shuō)明鎖狀態(tài)是偏向鎖。
如果最后兩個(gè)比特是:00, 則說(shuō)明鎖狀態(tài)是輕量級(jí)鎖。
如果最后兩個(gè)比特是:10, 則說(shuō)明鎖狀態(tài)是重量級(jí)鎖。

無(wú)鎖->偏向鎖->輕量級(jí)鎖->重量級(jí)鎖

不加鎖->一個(gè)線程持有鎖->多個(gè)線程持有鎖(cas)->cas一定次數(shù)無(wú)法取到鎖

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容