10行代码理解Java锁消除
導語:鎖消除是Java虛擬機在JIT編譯期間,通過對運行上下文的掃描,去除不可能存在共享資源競爭的鎖,通過鎖消除,可以節省毫無意義的請求鎖時間。本文作者舉例說明了鎖消除,并分析了鎖消除的條件,本文適合對于深入了解JVM有興趣的開發者。
問題:
我聽說JVM會對鎖進行優化,所以如果我寫了synchronized,JVM會幫我做優化!對嗎
理論:
在當前Java內存模型中,未觀察到的鎖不能保證具有任何效果。另外,這意味著在非共享對象上進行同步是無效的,因此runtime可以啥也不做。同步有可能是不需要的,這為優化提供了機會。
因此,如果逃逸分析發現對象是非逃逸的,編譯器就可以自行消除同步。
測試:
考慮如下JMH基準測試:
如果我們運行此測試并啟用-prof perfnorm profiler,將看到:
執行結果完全相同。這意味著生成的代碼是相同的。生成的代碼是這樣:
鎖完全被消除了。如果我們使用jvm參數-xx:-eliminateLocks,或者使用-xx:-doescapeanalysis禁用EA(這會破壞依賴EA的每個優化,包括鎖消除),則鎖計數器將膨脹:
顯示了兩種方式的開銷對比。
結論:
鎖消除是由于逃逸分析帶來的優化,它消除了多余的同步。當內部同步代碼沒有逃逸到外部時,runtime就可以完全消除同步了。
原文地址:
https://shipilev.net/jvm/anatomy-quarks/10-string-intern/
本文作者Aleksey Shipilёv,由方圓翻譯。轉載本文請注明出處,歡迎更多小伙伴加入翻譯及投稿文章的行列,詳情請戳公眾號菜單「聯系我們」。
總結
以上是生活随笔為你收集整理的10行代码理解Java锁消除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 农村黑产,才是真正的硬核朋克!
- 下一篇: Java虚拟机的Heap监狱