偏向鎖的獲取和撤銷邏輯

2021-10-12 10:39:39 字數 431 閱讀 3789

1. 首先獲取鎖 物件的markword,判斷是否處於可偏向狀態。(biased_lock=1、且threadid為空)

2. 如果是可偏向狀態,則通過cas操作,把當前執行緒的id寫入到markword 

a) 如果cas成功,那麼markword就會變成這樣。表示已經獲得了鎖物件的偏向鎖,接著執行同步**塊 

b) 如果cas失敗,說明有其他執行緒已經獲得了偏向鎖,這種情況說明當前鎖存在競爭,需要撤銷已獲得偏向鎖的執行緒,並且把它持有的鎖公升級為輕量級鎖(這個操作需要等到全域性安全點,也就是沒有執行緒在執行位元組碼)才能執行

3. 如果是已偏向狀態,需要檢查markword中儲存的threadid是否等於當前執行緒的threadid 

a) 如果相等,不需要再次獲得鎖,可直接執行同步**塊 

b) 如果不相等,說明當前鎖偏向於其他執行緒,需要撤銷偏向鎖並公升級到輕量級鎖

輕量級鎖和偏向鎖

synchronized會在物件的頭部打標記,這個加鎖的動作是必須要做的,悲觀鎖通常還會做許多其他的指令動作,輕量級鎖希望通過cas實現,它認為通過cas嘗試修改物件頭部的mark區域的內容就可以達到目的,由於mark區域的寬度通常是4 8位元組,也就是相當於乙個int或者long的寬度,是否適合於...

深入理解JVM 輕量級鎖和偏向鎖

jdk1.6出現的。並不能代替重量級鎖,本意是在沒有多執行緒競爭的前提下,減少傳統的重量級鎖使用作業系統互斥量產生的效能消耗。物件自身的執行時資料 如 雜湊嗎 hashcode gc分代年齡 generational gc age 等,這部分資料的長度在32位和64位的虛擬機器中分別為32bit和6...

多執行緒鎖的公升級和無鎖 偏向鎖 輕量級鎖 重量級鎖

隨著競爭情況逐漸公升級,鎖可以公升級但不能降級。鎖一共四種狀態,低 高無鎖狀態 偏向鎖狀態 輕量級鎖狀態 重量級鎖狀態。偏向鎖 優點 加鎖和解鎖不需要額外的消耗,和執行非同步方法相逼僅存在納秒級的差距。缺點 如果執行緒間存在鎖競爭,會帶來額外的鎖撤銷的消耗 適用只有乙個執行緒訪問同步塊場景 輕量級鎖...