JVM對Synchronized關(guān)鍵字的優(yōu)化

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)自旋
  • 鎖消除
  • 自旋鎖
  • 輕量級鎖
  • 鎖粗化

參考:Java高效并發(fā)(九)

Image result for Java object header

鎖升級

Synchonized的四種狀態(tài):

  • 無鎖
  • 偏向鎖,多數(shù)情況下,鎖不存在競爭,總是由同一線程獲得。
  • 輕量級鎖,由偏向鎖升級來的,第二個線程加入鎖爭用的時候,偏向鎖就會升級為輕量級鎖
  • 重量級鎖,同一時間訪問同一把鎖,就會有線程獲取鎖失敗,會導(dǎo)致輕量級鎖升級為重量級鎖
image-20190305082526875
image.png

參考

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

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

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