synchronized的鎖公升級原理

2021-10-05 21:55:46 字數 576 閱讀 6569

無鎖狀態->偏向鎖->輕量級鎖(自旋鎖)->重量級鎖

乙個物件一開始建立出來的時候是通常是偏向鎖狀態

當有另乙個執行緒來競爭的時候,就會公升級為輕量級鎖。競爭的2個執行緒會使用cas爭搶將自己執行緒棧中的lock record位址寫入物件頭的markword中。誰先寫成功,誰就獲得鎖。沒成功的就會不斷的自旋使用cas來等待獲取鎖機會。自旋會消耗cpu,因此當自旋數量過多時會消耗大量的cpu。

當某個執行緒的自旋次數超過一定數量(大多數是10次)或者自旋的執行緒的數量超過核心的二分之一就會公升級為重量級鎖。

當synchronize公升級為重量級鎖的時候,會有乙個指向互斥量(monitor物件)的指標,這個monitor物件定義了_waitset和_entrylist兩個佇列,在下面我們會說到這兩個佇列的作用。除此之外,monitor物件中還有個_owner指標指向鎖的持有者

首先,當乙個執行緒去競爭鎖,它會被放進_entrylist中去競爭,如果競爭成功,_owner指標就會指向當前執行緒,同時_count+1,如果競爭失敗,會重新回到_entrylist中。如果乙個執行緒被呼叫了wait(),那麼會釋放當前持有鎖,_count-1且當前執行緒進入_waitset等待被喚醒。

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...