JAVA輕量級鎖簡介

許佳佳233發表於2018-10-20

概念

在某些場景下,去獲取物件鎖的時候使用CAS的方式,而不是阻塞。
輕量級鎖能夠提升程式同步效能的一句是“對於絕大部分的鎖,在整個同步週期內都是不存在競爭的”,這是一個經驗資料。

在 Java Object標頭檔案中,有一個“Mark Word”物件,它是實現輕量級鎖的關鍵。
Mark Word的資料結構非固定,根據不同的狀態會有不同的結構。
比如在32位的HotSpot虛擬機器中物件未被鎖定的狀態下,Mark Word的32bit空間中的25bit用於儲存物件雜湊碼,4bit用於儲存物件分代年齡,2bit用於儲存鎖標誌位,1bit固定為0。
其主要的幾個狀態如下:

狀態 標誌位 儲存內容
未鎖定 01 物件雜湊碼、物件分代年齡
輕量級鎖定 00 指向鎖記錄的指標
重量級鎖定 10 指向重量級鎖的指標
GC標誌 11 空,不需要記錄資訊
可偏向 01 偏向執行緒ID、偏向時間戳,物件分代年齡

輕量級鎖加鎖過程

(1)在程式碼進入同步塊的時候,如果同步物件鎖狀態為無鎖狀態(鎖標誌位為“01”狀態),虛擬機器首先將在當前執行緒的棧幀中建立一個名為鎖記錄(Lock Record)的空間,用於儲存舊的Mark Word的拷貝,官方稱其為Displaced Mark Word。(鎖記錄解鎖的時候會用到)

(2)虛擬機器將使用CAS操作嘗試將物件的Mark Word更新為輕量級鎖的標誌位和指向鎖記錄(Lock Record)的指標。

(3)如果這個更新動作成功了,那麼這個執行緒就擁有了該物件的鎖。

(4)如果這個更新操作失敗了,虛擬機器首先會檢查當前執行緒是否已經擁有了這個物件的鎖,如果已經擁有,那就可以直接進入同步塊繼續執行。否則就說明這個鎖度一項已經被其他執行緒搶佔了。一旦發生這種情況,那麼輕量級鎖就會膨脹為重量級鎖。Mark Word中儲存的就會指向重量級鎖的指標,後面等待鎖的執行緒也會進入阻塞狀態。

輕量級鎖解鎖過程

(1)通過CAS操作嘗試把執行緒中複製的Displaced Mark Word物件替換當前的Mark Word。

(2)如果替換成功,整個同步過程就完成了。

(3)如果替換失敗,說明有其他執行緒嘗試過獲取該鎖,並導致該鎖變成了重量級鎖,那就要在釋放鎖的同時,喚醒被掛起的執行緒。

畫圖理解

在這裡插入圖片描述

加鎖

用New Mark Word替換Old Mark Word。

解鎖

用Displaced Mark Word替換New Mark Word。

相關文章