Java對象頭和Monitor是實(shí)現(xiàn)synchronized關(guān)鍵字的基礎(chǔ)。
對象頭
對象頭在內(nèi)存中的布局:
- 對象頭
- 實(shí)例數(shù)據(jù)
- 對齊填充
重點(diǎn)說下對象頭,對象頭的結(jié)構(gòu):
- Mark Word: 默認(rèn)存儲對象的hashcode,分代年齡,鎖類型,鎖標(biāo)志位等信息,實(shí)現(xiàn)輕量級鎖和偏向鎖的關(guān)鍵
- Class Meta Address:類型指針指向?qū)ο蟮念愒獢?shù)據(jù),JVM通過這個指針確定該對象是哪個類的數(shù)據(jù)
Java中對象在創(chuàng)建的時候就自帶了一把Monitor。早期版本中的synchronized依賴mutex lock實(shí)現(xiàn),其底層依賴操作系統(tǒng)的內(nèi)核態(tài),開銷很大,所以早期的加鎖性能很低。而后來,HotSpot對synchronized做了很大的優(yōu)化,現(xiàn)在的效率很不錯了。
如:
- 自適應(yīng)自旋
- 鎖消除
- 自旋鎖
- 輕量級鎖
- 鎖粗化

Image result for Java object header
鎖升級
Synchonized的四種狀態(tài):
- 無鎖
- 偏向鎖,多數(shù)情況下,鎖不存在競爭,總是由同一線程獲得。
- 輕量級鎖,由偏向鎖升級來的,第二個線程加入鎖爭用的時候,偏向鎖就會升級為輕量級鎖
- 重量級鎖,同一時間訪問同一把鎖,就會有線程獲取鎖失敗,會導(dǎo)致輕量級鎖升級為重量級鎖

image-20190305082526875

image.png