java 偏向鎖怎么升級為輕量級鎖


因為偏向鎖,鎖住對象時,會寫入對象頭相應的標識,我們先把對象頭(官方叫法為:Mark Word)的圖示如下(借用了網友的圖片):

      

 

 

    通過上面的圖片,我們可以知道,對象處於偏向鎖時,mark word中的偏向鎖標記為1,鎖標志位為01;下面是分析過jvm源碼(biasedLocking.cpp)解析的偏向鎖升級流程(忽略一些細節),示例中:線程1當前擁有偏向鎖對象,線程2是需要競爭到偏向鎖。

  1. 線程2來競爭鎖對象;
  2. 判斷當前對象頭是否是偏向鎖;
  3. 判斷擁有偏向鎖的線程1是否還存在;
  4. 線程1不存在,直接設置偏向鎖標識為0(線程1執行完畢后,不會主動去釋放偏向鎖);
  5. 使用cas替換偏向鎖線程ID為線程2,鎖不升級,仍為偏向鎖;
  6. 線程1仍然存在,暫停線程1;
  7. 設置鎖標志位為00(變為輕量級鎖),偏向鎖為0;
  8. 從線程1的空閑monitor record中讀取一條,放至線程1的當前monitor record中;
  9. 更新mark word,將mark word指向線程1中monitor record的指針;
  10. 繼續執行線程1的代碼;
  11. 鎖升級為輕量級鎖;   
  12. 線程2自旋來獲取鎖對象;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM