Java 鎖升級的過程詳解
Java 虛擬機(JVM)為了提高多線程并發的效率,對內置鎖(synchronized
關鍵字)的實現進行了一系列優化。這些優化體現在鎖的升級過程中,即當競爭程度從低到高變化時,鎖的狀態會從偏向鎖逐漸升級為輕量級鎖,最終升級為重量級鎖。這個過程是不可逆的,一旦鎖升級到更高級別,就不能降級。
1. 無鎖狀態 (Unlocked)
當一個對象剛剛被創建時,它的對象頭中的Mark Word(標記字段)處于無鎖狀態。此時,任何線程都可以嘗試獲取該對象的鎖。
2. 偏向鎖 (Biased Locking)
偏向鎖是JVM在沒有實際競爭發生時,為了消除同步開銷而引入的一種優化。它旨在減少只有一個線程反復獲取同一把鎖時的開銷。
-
特點:
- 當一個線程第一次訪問同步塊并成功獲取鎖時,JVM會將對象的Mark Word設置為偏向模式,并將該線程的ID記錄在Mark Word中。
- 之后,如果同一個線程再次訪問這個同步塊,它不需要再進行任何同步操作(如CAS操作),只需要簡單地檢查Mark Word中的線程ID是否是自己即可。
- 偏向鎖的撤銷(Revocation)發生在有其他線程嘗試獲取這個偏向鎖時。
-
升