鎖升級過程
無鎖 -> 偏向鎖 -> 輕量級鎖 -> 重量級鎖
image.png
鎖升級原理圖
synchronized 加鎖原理.png
無鎖 -> 偏向鎖
線程T1請求synchronized同步對象O饼丘,檢查對象O存儲的線程是否為T1缴守,若是,無需CAS加鎖解鎖贴捡,繼續(xù)執(zhí)行同步代碼塊村砂;若否烂斋,檢查對象O存儲的線程是否存活汛骂,若否,重置對象O為無鎖评腺,線程T1競爭得到偏向鎖
偏向鎖 -> 輕量級鎖
此時對象O存儲的為線程T1帘瞭,線程T2也來競爭鎖,檢查線程T1是否要繼續(xù)持有鎖蒿讥,若否蝶念,重置對象O為無鎖芋绸,線程T2可競爭得到偏向鎖媒殉;若繼續(xù)持有,暫停T1線程摔敛,撤銷偏向鎖,升級為輕量級鎖
輕量級鎖 -> 重量級鎖
線程T1獲取輕量級鎖時马昙,先將對象O的對象頭Mark word 拷貝一份到線程T1在棧幀中創(chuàng)建的存儲鎖記錄空間桃犬,然后使用CAS操作把對象頭中內(nèi)容替換為線程T1的存儲記錄;若線程T1執(zhí)行復(fù)制操作時行楞,線程T2也嘗試獲取鎖攒暇,復(fù)制對象頭到T2的鎖記錄空間敢伸,此時T1已經(jīng)CAS完成,T2的CAS操作失敗恒削,T2嘗試自旋方式繼續(xù)嘗試獲取鎖池颈,自旋次數(shù)達(dá)到最大閾值時尾序,或者此時線程T3也來競鎖,輕量級鎖升級重量級鎖躯砰;未獲得鎖的T2、T3將會阻塞琢歇,減少CPU空轉(zhuǎn)兰怠。
Mark word 對象頭
image.png