synchronized 鎖公升級過程中偏向鎖如何公升級?

時間 2021-06-30 12:42:49

1樓:陸萌萌

其實文章裡已經寫得非常明白了。。。

執行緒1先獲取偏向鎖,記錄執行緒id,執行緒2來啦,通過cas修改執行緒id,失敗…………我想問為什麼失敗,cas修改是什麼意思

這裡你需要去補一補關於CAS的知識,簡單來說,CAS的邏輯是(注意是邏輯,實際不是這麼實現的):

private

static

intnum

;private

static

boolean

cas(

intexpect

,int

update

)else

}也就是對資料進行比較,如果和預期值相同,則更新資料,否則不做任何操作,其中比較和更新是乙個原子操作,也就是說不會出現比較完成資料被另乙個執行緒修改的情況,一定是比較然後更新,中間不會有別的操作。

因此,這裡cas失敗的原因很明顯,因為A執行緒設定了偏向鎖標誌位的執行緒id是A,那麼B執行緒去執行cas(空, B)一定是不更新資料並返回false的,因為物件頭的標誌位已經是A了。

而第一次執行加鎖操作時,cas操作A執行緒執行cas(空, A),由於物件頭上的資料真的就是空標誌,因此cas會返回true,同時將標誌位置為A。

同時,如果是偏向鎖當前執行緒自己給自己加鎖的情況,那麼在執行cas前判斷發現執行緒物件頭上儲存的標誌就是自身,則直接就完成了加鎖操作(即「偏向自身」不做任何操作)。

執行緒1什麼條件下釋放偏向鎖,偏向鎖可以偏向完執行緒1後再偏向執行緒2嗎

這個問題其實比較複雜,當前的JVM實現上,偏向鎖是不會被主動釋放掉的,只有在被別的執行緒爭搶鎖之後進入safepoint才可能撤回偏向鎖。這時JVM會判斷偏向鎖的撤回次數是否到某個設定的閾值,如果超過閾值,則進行鎖公升級(進入樂觀鎖),不超過閾值才會解鎖(解鎖後就能被別的執行緒偏向了),這部分邏輯可以參考偏向鎖設定的epoch、revoke欄位的邏輯。

Java中synchronized鎖和Lock鎖在CPU層的實現,或者說在JVM層的實現是否是一致的?

蘇維 這兩個東西實現的原語不一樣,一種是mutex原語,一種是monitor原語,原語決定了用途,怎麼實現反而是次要的,隨時都能改。 wuxinliulei 不能完全這麼說,因為synchronized鎖在jdk1.6之後優化為偏向鎖,輕量級鎖,重量級鎖三種形態,CAS的使用是輕量級鎖,重量級鎖的實...

synchronized鎖定的到底是什麼?

建議看一下UNIX程式設計。如果學過UNIX 多執行緒,那麼就應該能理解。synchronized 說到底就是一把鎖。相當於訊號量的操作,用於同步互斥。 徐辰 每個object有乙個monitor,這東西其實就是個recursive lock,呼叫synchronized方法或者進入synchron...

有鎖iPhone可以公升級系統嗎?值不值得購買?

小小怪將軍 我之前不懂手機,買了個蘋果六應該屬於黑解機,降了一次系統才知道是黑解機,手機直接上鎖,無法啟用,只能使用卡貼,不保值,我感覺不建議買! 取決於有鎖機和無鎖機的差價是否能打動你,讓你為了這差價可以選擇麻煩一點。有些人覺得幾百塊不足以打動,不過有鎖版和大陸版差價經常是上千塊或者兩三千。你覺得...