鎖優化

若是你不想平庸,就請勿中止前進的腳步。一樣做爲主流的開發語言,Java也沒有中止前進,而是一直在優化進步。更多內容請搜索關注微信公衆號:Different Java微信

摘要

  1. 爲何須要鎖優化
  2. 鎖的狀態
  3. 偏向鎖
  4. 輕量級鎖
  5. 鎖升級
  6. 鎖消除

1. 爲何須要鎖優化

synchronized Lock在JDK1.6以前效率低下,緣由咱們已經在悲觀鎖中講述過了,所以爲了提升鎖的效率,JVM對其進行了優化。優化

2. 鎖的狀態

鎖優化的過程也是鎖狀態變動的過程,鎖的狀態目前有如下幾種:spa

  • 無狀態鎖
  • 偏向鎖
  • 輕量級鎖
  • 重量級鎖

鎖的狀態是如何標記的,這就須要藉助Java對象在內存中的存儲格式。Java對象在虛擬機中大體分爲三部分:操作系統

  • 對象頭
  • 實例數據
  • 對齊填充

對象頭中存儲對象自身運行時的數據(Mark Word)以及類型指針,而鎖的狀態則保存在Mark Word中。 因爲鎖狀態的不一樣,Mark Word也會不相同。各類鎖狀態下的Mark Word(32位 JVM)以下:線程

WX20210509-185643@2x.png

3. 偏向鎖

若是一個線程得到了鎖,那麼鎖就進入偏向模式,此時對象的Mark Word也會進入偏向鎖模式,當該線程再次請求鎖無需執行獲取鎖操做,省去了大量獲取鎖的時間。對於競爭不激烈的場合偏向鎖的提高效果仍是很明顯的,可是競爭激烈的場合建議關閉偏向鎖,能夠使用-XX:-UseBiasedLocking此參數關閉偏向鎖。3d

偏向鎖的鎖定和撤銷的簡要步驟以下:指針

WX20210509-213842@2x.png

4. 輕量級鎖

當偏向鎖失敗時,虛擬機不會當即掛起線程。它會將對象頭部做爲指針,指向持有鎖的線程堆棧內部,來判斷一個線程是否持有對象鎖。若是成功,則能夠進入臨界區,失敗之後會膨脹爲重量級鎖,可是膨脹後,虛擬機還會作最後一次努力優化,那就是自旋鎖。對象

輕量級鎖膨脹重量級鎖的簡要步驟以下:token

WX20210509-223750@2x.png

5. 自旋鎖

因爲當前線程暫時沒法得到鎖,但什麼時候獲取也是未知的。有可能在幾個CPU時鐘週期後即可獲得鎖,此時虛擬機或進行一次賭注,會讓當前線程作幾個空循環,在通過若干次循環後若是能夠獲得鎖便進入臨界區,若是不能得到鎖,則將線程真正從操做系統層面掛起。內存

6. 鎖升級

WX20210509-225054@2x.png

鎖只能升級不能降級,鎖升級的詳細步驟以下:

WX20210509-225239@2x.png

7. 鎖消除

鎖消除是JVM運行時經過JIT編譯來發現不可能存在共享資源競爭的鎖,而後將其消除(消除的關鍵是要藉助逃逸分析),節省無心義的請求時間。

本期的Java鎖優化就介紹到這,我是shysh95,咱們下期再見!

相關文章
相關標籤/搜索