synchronized 鎖的公升級原理是什麼

2022-08-01 20:30:20 字數 1285 閱讀 8591

鎖的級別從低到高:

無鎖 -> 偏向鎖 -> 輕量級鎖 -> 重量級鎖

鎖分級別原因:

沒有優化以前,sychronized是重量級鎖(悲觀鎖),使用 wait 和 notify、notifyall 來切換執行緒狀態非常消耗系統資源;執行緒的掛起和喚醒間隔很短暫,這樣很浪費資源,影響效能。所以 jvm 對 sychronized 關鍵字進行了優化,把鎖分為 無鎖、偏向鎖、輕量級鎖、重量級鎖 狀態。

無鎖:沒有對資源進行鎖定,所有的執行緒都能訪問並修改同乙個資源,但同時只有乙個執行緒能修改成功,其他修改失敗的執行緒會不斷重試直到修改成功。

偏向鎖:物件的**一直被同一執行緒執行,不存在多個執行緒競爭,該執行緒在後續的執行中自動獲取鎖,降低獲取鎖帶來的效能開銷。偏向鎖,指的就是偏向第乙個加鎖執行緒,該執行緒是不會主動釋放偏向鎖的,只有當其他執行緒嘗試競爭偏向鎖才會被釋放。

偏向鎖的撤銷,需要在某個時間點上沒有位元組碼正在執行時,先暫停擁有偏向鎖的執行緒,然後判斷鎖物件是否處於被鎖定狀態。如果執行緒不處於活動狀態,則將物件頭設定成無鎖狀態,並撤銷偏向鎖;

如果執行緒處於活動狀態,公升級為輕量級鎖的狀態。

輕量級鎖:輕量級鎖是指當鎖是偏向鎖的時候,被第二個執行緒 b 所訪問,此時偏向鎖就會公升級為輕量級鎖,執行緒 b 會通過自旋的形式嘗試獲取鎖,執行緒不會阻塞,從而提高效能。

當前只有乙個等待執行緒,則該執行緒將通過自旋進行等待。但是當自旋超過一定的次數時,輕量級鎖便會公升級為重量級鎖;當乙個執行緒已持有鎖,另乙個執行緒在自旋,而此時又有第三個執行緒來訪時,輕量級鎖也會公升級為重量級鎖。

重量級鎖:指當有乙個執行緒獲取鎖之後,其餘所有等待獲取該鎖的執行緒都會處於阻塞狀態。

重量級鎖通過物件內部的監視器(monitor)實現,而其中 monitor 的本質是依賴於底層作業系統的 mutex lock 實現,作業系統實現執行緒之間的切換需要從使用者態切換到核心態,切換成本非常高。

鎖狀態對比:

偏向鎖輕量級鎖

重量級鎖

適用場景

只有乙個執行緒進入同步塊

雖然很多執行緒,但是沒有衝突:多條執行緒進入同步塊,但是執行緒進入時間錯開因而並未爭搶鎖

發生了鎖爭搶的情況:多條執行緒進入同步塊並爭用鎖

本質取消同步操作

cas操作代替互斥同步

互斥同步

優點不阻塞,執行效率高(只有第一次獲取偏向鎖時需要cas操作,後面只是比對threadid)

不會阻塞

不會空耗cpu

缺點適用場景太侷限。若競爭產生,會有額外的偏向鎖撤銷的消耗

長時間獲取不到鎖空耗cpu

阻塞,上下文切換,重量級操作,消耗作業系統資源

部分內容摘自:

synchronized 鎖的重入

1 乙個同步方法呼叫另外乙個同步方法,能否得到鎖?重入 synchronized預設支援重入 slf4j topic test public class demo catch interruptedexception e test2 為什麼test2還需要加sync 他本身就包含在test1 而te...

synchronized 修飾的鎖

datetime 2020 11 25 21 14 author db public class concurrency private static void lockcode private static void lockmethod 鎖的是物件例項方法,同一物件是同步的,不同物件是非同步的 ...

synchronized鎖的公升級

在分析markword時,提到了偏向鎖 輕量級鎖 重量級鎖。在分析這幾種鎖的區別時,我們先來思考乙個問題 使用鎖能夠實現資料的安全性,但是會帶來效能的下降。不使用鎖能夠基於執行緒並行提公升程式效能,但是卻不能保證執行緒安全性。這兩者之間似乎是沒有辦法達到既能滿足效能也能滿足安全性的要求。hotspo...