一文帶你真正了解偏向鎖

談到 java的關(guān)鍵字synchronized,幾乎必談偏向鎖,因?yàn)樵嫉膕ynchronized,,大有殺雞用牛刀的架勢(shì)。在并發(fā)程度不高的情況下,經(jīng)常被詬病性能不佳。
因此,在juc大行其道之際,jdk開(kāi)發(fā)者也深感臉上掛不住,終于在jdk9引入了偏向鎖,并下放到j(luò)dk8u。但可惜,迄今為止,市面上對(duì)于偏向鎖原理,難以找到一個(gè)詳細(xì)的解讀,大部分文章也都是抄來(lái)抄去,讓人有些疑惑始終不得其解。
1.什么情況下會(huì)有偏向鎖?
2.偏向鎖和synchronized其他階段如何結(jié)合?
3.偏向鎖為什么會(huì)提高低并發(fā)下的效率?
4.偏向鎖會(huì)撤銷嗎?
當(dāng)然,第三問(wèn),現(xiàn)在就可以給出答案,因?yàn)槲覀冊(cè)趯懘a時(shí),盡管用到了synchronized關(guān)鍵字,但只是為了保證代碼的并發(fā)安全,并不是說(shuō)這里一定就會(huì)并發(fā)。對(duì)于大多數(shù)代碼而言,同一時(shí)刻實(shí)際只會(huì)有一個(gè)線程在執(zhí)行,這種時(shí)候不應(yīng)當(dāng)直接使用代價(jià)高的同步模式,而是先嘗試做個(gè)標(biāo)記,當(dāng)真正發(fā)生競(jìng)爭(zhēng)時(shí)再考慮同步,至于其他問(wèn)題,可以看本文。
本文旨在直觀展示各種場(chǎng)景下,偏向鎖是否會(huì)生成,又是否會(huì)撤銷。關(guān)于重偏向,批量撤銷等進(jìn)階內(nèi)容,會(huì)在synchronized鎖粗化的內(nèi)容中講解。
本文引用了jol包來(lái)輸出對(duì)象頭的二進(jìn)制情況
關(guān)于對(duì)象頭,還需要以下知識(shí),在64位的虛擬機(jī)下,對(duì)象頭有以下幾種狀態(tài),需要注意的是,當(dāng)對(duì)象生成時(shí),其處于匿名偏向狀態(tài)(與偏向狀態(tài)一樣,但線程位置為空)或無(wú)鎖狀態(tài),這取決于你是否開(kāi)啟了偏向鎖參數(shù)-XX:+UseBiasedLocking(jdk8u默認(rèn)開(kāi)啟),這兩種狀態(tài)是一個(gè)對(duì)象頭的初始狀態(tài)。一個(gè)容易混淆的地方是,無(wú)鎖狀態(tài)是無(wú)法升級(jí)到偏向鎖的,無(wú)鎖只能升級(jí)為輕量級(jí)鎖。只有初始狀態(tài)為匿名偏向的,才能升級(jí)至偏向鎖。

