Synchronized鎖簡記

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容