1、關于三個常提到的鎖 偏向鎖 輕量級鎖 重量級鎖
jdk大佬對Synchronized關鍵字的優(yōu)化
舉個例子,如下代碼
public class SyncL {
public synchronized void eat() {
System.out.println(111);
}
}
過程剖析:
step1:小明第一次調用eat,加個偏向鎖,釋放之前接著調用,做個簡單檢查發(fā)現(xiàn)偏向鎖id就是自己,繼續(xù)執(zhí)行
step2:這時候小紅來調用eat,發(fā)現(xiàn)已經加了偏向鎖,并且小明還在“吃”就把鎖升級為輕量鎖,自己則排隊中
step3:這時候小芳出現(xiàn)了也要eat一下,發(fā)現(xiàn)是個輕量級鎖,升級為重量級鎖,自己去排隊~
總結:
A、性能上來說,偏向鎖高于輕量級鎖高于重量級鎖
B、加鎖過程是 偏向鎖->輕量級鎖->重量級鎖
2、當synchronized加在代碼塊上,編譯之后會看到兩個指令如下:
monitorenter指令進入同步塊
monitorexit指令退出同步塊
3、當synchronized加在方法上時,編譯后會看到
添加了ACC_SYNCHRONIZED標記
4、鎖信息是存在于對象頭的mark word中的。當對象狀態(tài)為偏向鎖(biasable)時,mark word存儲的是偏向的線程ID;當狀態(tài)為輕量級鎖(lightweight locked)時,mark word存儲的是指向線程棧中Lock Record的指針;當狀態(tài)為重量級鎖(inflated)時,為指向堆中的monitor對象的指針。
這里只是舉個例子方便記憶,具體細節(jié)參考:
https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247487298&idx=1&sn=b4ccd12d26329dbc5f1abc45ec83de0e&scene=21#wechat_redirect