偏向鎖 輕量級鎖

2021-09-26 11:19:30 字數 835 閱讀 6245

大多數情況下,不僅不存在多執行緒競爭,而且乙個執行緒會一直去執行乙個同步**塊。

基於這種情況,當環境中只有乙個執行緒時,使用無鎖機制:偏向鎖。

當某個執行緒獲取到物件的鎖後,會將物件的物件頭設定為:(鎖標誌位置為01,偏向鎖標誌為1,偏向執行緒id為當前執行緒的id),並在當前執行緒的棧幀中記錄偏向鎖資訊。以後再執行同步**塊時,不用在執行cas進行鎖的獲取與釋放。

只需要測試物件的物件頭中是否有當前執行緒的偏向鎖(鎖標誌位置為01,偏向鎖標誌為1,偏向執行緒id為當前執行緒的id)。測試成功則執行同步**塊,失敗的話,看物件的偏向鎖標誌位是否為1,如果為1則使用cas去將物件的鎖id換成自己的,如果沒有,去cas獲取獲取偏向鎖。

流程:

執行緒遇到同步**塊時,會先去看物件是否被加鎖。如果加鎖,判斷是否為偏向鎖,如果不是則執行輕量級鎖流程,如果為偏向鎖,判斷物件的偏向執行緒id是否為自己,如果是則執行同步**塊。如果不是,用cas去將物件的偏向執行緒id換為自己。換成功則獲取到鎖,設定物件頭,置換失敗則表明存在競爭,執行偏向撤銷。

如果物件未被加鎖,則先判斷是否支援偏向鎖(因為可通過jvm引數進行設定),如果沒有進行輕量級鎖流程。支援的話,會去cas獲取偏向鎖。獲取成功則把設定物件頭並去執行**塊。獲取失敗則表明存在競爭,執行偏向撤銷。

偏向撤銷:

等到全域性安全點(當前jvm未執行任何位元組碼)後,首先會暫停持有偏向鎖定的執行緒,然後判斷執行緒是否存活,如果未存活,則將物件頭設定為無所狀態。反之,將擁有偏向鎖的棧幀執行完。然後判斷是否將競爭執行緒設為偏向物件,或者將共享物件設為無鎖狀態。最後將之前擁有偏向鎖的執行緒喚醒。

輕量級鎖用cas操作來代替使用重量級的阻塞現象。

輕量級鎖和偏向鎖

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

偏向鎖 輕量級鎖 重量級鎖

首先簡單說下先偏向鎖 輕量級鎖 重量級鎖三者各自的應用場景 偏向鎖 只有乙個執行緒進入臨界區 輕量級鎖 多個執行緒交替進入臨界區 重量級鎖 多個執行緒同時進入臨界區。還要明確的是,偏向鎖 輕量級鎖都是jvm引入的鎖優化手段,目的是降低執行緒同步的開銷。比如以下的同步 塊 synchronized l...

偏向鎖 輕量級鎖 重量級鎖

synchronized關鍵字就像是汽車的自動檔,現在詳細講這個過程。一腳油門踩下去,synchronized會從無鎖公升級為偏向鎖,再公升級為輕量級鎖,最後公升級為重量級鎖,就像自動換擋一樣。那麼自旋鎖在 呢?這裡的輕量級鎖就是一種自旋鎖。初次執行到synchronized 塊的時候,鎖物件變成偏...