在Java中,特別是ReentrantLock
和synchronized
關鍵字的實現中,鎖的升級通常涉及到從無鎖狀態到偏向鎖、再升級到輕量級鎖,最后可能升級到重量級鎖的過程。這一系列過程是為了減少鎖帶來的開銷,提高并發效率。
-
偏向鎖(Biased Locking):大多數情況下,鎖會偏向于第一個獲得它的線程,之后此線程再次請求鎖時,無需進行同步操作,直接訪問。這是一種優化措施,假定鎖將由同一線程多次獲取。
-
輕量級鎖(Lightweight Locking):當有第二個線程嘗試獲取已被偏向的鎖時,偏向鎖會升級為輕量級鎖。輕量級鎖通過CAS操作(Compare and Swap)試圖將鎖標志位設置為“鎖定狀態”,避免重量級鎖帶來的操作系統層面的開銷。
-
重量級鎖(Heavyweight Locking):如果輕量級鎖下的多個線程爭用同一個鎖導致CAS失敗(即自旋操作達到一定次數后),鎖會進一步升級為重量級鎖,這時會涉及到操作系統層面的互斥鎖(mutex),線程會被阻塞和喚醒,開銷較大。