鎖升級的過程

一. 問題背景

面試的過程中可能會問到“鎖升級的過程”。

二. 鎖升級的過程

  • 鎖的狀態有無鎖、偏向鎖、輕量級鎖、重量級鎖。鎖的狀態會隨着鎖的競爭升級,這是一個不可逆的過程。

  • 代碼進入同步塊的時候,首先在棧幀中創建一個鎖記錄(Lock Record),鎖記錄是一個數據結構。鎖對象的Mark Word會被複制到鎖記錄中,此時鎖記錄中稱爲Displaced Mark Word。

  • 一開始是無鎖狀態,對象鎖的對象頭Mark Word中的鎖標記是01,是否偏向鎖的位置上是0。當鎖對象第一次被線程獲取的時候,鎖對象的Mark Word中的是否偏向鎖的位置上變爲1,鎖標記仍爲01。通過使用CAS操作將當前線程的線程ID設置到鎖對象的Mark Word中,如果設置成功了,那麼當前線程得到了這個鎖對象了,可以執行同步代碼塊的代碼,以後每次進入這個鎖相關的同步塊時,都可以不再使用任何操作(比如lock,cas之類),此時處於偏向鎖狀態。當有另一個線程嘗試獲取偏向鎖時,偏向模式宣告結束。根據鎖對象目前是否處於鎖定狀態,撤銷偏向後恢復到未鎖定狀態或者輕量級鎖定的狀態。

  • 當有一條線程嘗試獲取處於輕量級鎖的鎖對象時,首先在棧幀中創建鎖記錄,然後將鎖對象的Mark Word複製到鎖記錄中,然後使用CAS操作(一般是10次)把鎖對象的Mark Word設置爲指向鎖記錄的指針,如果設置成功(後面的自旋次數相應提高,這就是適應性自旋),那麼這個線程就擁有該對象的鎖,並且對象的Mark Word的鎖標誌位變爲了00。如果設置失敗,那麼首先檢查對象的Mark Word是否指向當前線程的棧幀,如果是則說明當前線程已經擁有這個對象的鎖,可以直接進入同步塊執行,否則說明則這個鎖對象已經被其他線程佔用了。那麼輕量級鎖膨脹爲重量級鎖。鎖對象的Mark Word中鎖標誌變爲10,Mark Word指向重量級鎖,後面等待鎖的線程也進入阻塞狀態。

  • 輕量級鎖的解鎖過程通過CAS操作進行。如果鎖對象的Mark Word仍指向線程的鎖記錄,那麼通過CAS操作把對象的Mark Word與線程中複製得來的Displaced Mark Word替換回來。如果替換成功,那麼解鎖成功;否則在釋放鎖的同時,要喚醒阻塞的線程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章