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

2021-08-07 08:13:22 字數 711 閱讀 6973

jdk1.6出現的。並不能代替重量級鎖,本意是在沒有多執行緒競爭的前提下,減少傳統的重量級鎖使用作業系統互斥量產生的效能消耗。

物件自身的執行時資料

如:雜湊嗎(hashcode)、gc分代年齡(generational gc age)等,這部分資料的長度在32位和64位的虛擬機器中分別為32bit和64bit,簡稱「mark word」,如果物件是陣列型別,則虛擬機器用3個word(字寬)儲存物件頭,如果物件是非陣列型別,則用2word儲存物件頭。物件頭第一部分資訊是實現輕量級鎖和偏向鎖的關鍵

儲存指向方法區物件型別資料的指標

指向方法區物件型別資料的指標,如果是陣列物件的話,還會有乙個額外的部分用於儲存陣列長度。

物件頭資訊是與物件自身定義的資料無關的額外儲存成本。markword被設計為乙個非固定的資料結構以便在極小的空間儲存盡量多的資訊。它會根據物件的狀態復用自己的儲存空間。例如:在32位的hotspot虛擬機器中物件未被鎖定的狀態下,mark word的32bit空間中的25bit用於儲存物件雜湊嗎(hashcode),4bit用於儲存物件分代年齡,2bit用於儲存鎖標誌位,1bit固定為0。其他狀態下物件的儲存內容

鎖狀態包括:輕量級鎖定、重量級鎖定、gc標記、可偏向

32位jvm的mark word的預設儲存結構如下:

未完待續。

輕量級鎖和偏向鎖

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

偏向鎖 輕量級鎖

大多數情況下,不僅不存在多執行緒競爭,而且乙個執行緒會一直去執行乙個同步 塊。基於這種情況,當環境中只有乙個執行緒時,使用無鎖機制 偏向鎖。當某個執行緒獲取到物件的鎖後,會將物件的物件頭設定為 鎖標誌位置為01,偏向鎖標誌為1,偏向執行緒id為當前執行緒的id 並在當前執行緒的棧幀中記錄偏向鎖資訊。...

偏向鎖 輕量級鎖 重量級鎖

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