輕量級鎖
如果一個資源有多個線程訪問喷楣,但多線程訪問的時(shí)間是錯開的(無競爭),如果產(chǎn)生了競爭會升級為重量級鎖对蒲。
語法任然是synchronized
加鎖過程
調(diào)用加鎖方法時(shí)萝快,線程的棧幀里產(chǎn)生一個鎖記錄對象(JVM層面),
鎖記錄中的Object reference指向鎖對象庙睡。
通過ca操作替換鎖對象(Object)的mark word事富,將mark word的值存入鎖記錄,mark woed的值就變?yōu)榱随i記錄的地址和狀態(tài)碼
如果cas失敗有兩種情況
1乘陪、其他線程已經(jīng)擁有了這個對象鎖统台,表明有競爭,進(jìn)入鎖膨脹
2啡邑、如果原來的線程自己執(zhí)行了synchronized鎖重入贱勃,在添加一個lock record
[圖片上傳失敗...(image-e6e68e-1606314354976)]
升級為重量級鎖
[圖片上傳失敗...(image-83a17d-1606314354976)]
自旋鎖
自旋是為了讓后來的線程一嘗試獲取鎖,而不是讓他進(jìn)入阻塞狀態(tài)。適合多核cpu贵扰。如果重試多次后不成功則進(jìn)入阻塞狀態(tài)仇穗。jdk7后不能控制是否開啟自旋
偏向鎖
偏向鎖在對輕量鎖的優(yōu)化在于每次鎖重入不需要進(jìn)行cas操作,CAS是cpu的一條指令戚绕。具體操作是將線程id設(shè)置到對象的mark word頭纹坐,而不是輕量級鎖中的鎖記錄對象地址