java 鎖升級

java鎖升級路線 偏向鎖->輕量級鎖->重量級鎖(互斥量)

1: 正常無鎖狀態(tài)

輕量級鎖未鎖定狀態(tài)

25bit 4bit 1bit 是否偏向鎖 2bit 鎖標志位
對象hashcode 分代年齡 0 01

偏向鎖未鎖定狀態(tài)

23bit 2bit 4bit 1bit 是否偏向鎖 2bit 鎖標志位
0 epoch 分代年齡 1 01

2: 當A線程要獲得鎖時,進入偏向模式

  • 2.1 如果處于無鎖狀態(tài),則鎖對象會更新為
23bit 2bit 4bit 1bit 是否偏向鎖 2bit 鎖標志位
ThreadA id epoch 分代年齡 1 01
  • 2.2 若鎖對象處于偏向模式,同時threadId等于自己,則直接進入同步模塊,不需要進行任何線程調(diào)度

3:當另一個B線程要獲得鎖,發(fā)現(xiàn)是偏向模式,并且threadA != threadB

  • 3.1 在到達安全點時,threadA暫停,偏向鎖升級為輕量級鎖,這時鎖對象頭會變成
30bit 2bit 鎖標志位
lock record pointer 00

這時在threadA的棧幀中會有個lock record
|hash|age|01|
|owner??????????|

4:當線程釋放輕量級鎖的時候會用cas 吧 hash age放回輕量級鎖的mark word中,同時鎖標志位變成01

5 當線程B cas 輕量級鎖成功,或者失敗但是鎖的 lock record pointer是自己的時直接進入同步塊

5:當線程C cas獲取輕量級線程失敗,同時 lock record pointer不是自己的時, 輕量級鎖膨脹為重量級鎖,鎖對象的鎖標志位變成00。自己本身掛起。

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

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

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