歡迎光臨
每天分享高質量文章

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,由方圓翻譯。轉載本文請註明出處,歡迎更多小伙伴加入翻譯及投稿文章的行列,詳情請戳公眾號選單「聯繫我們」。

    赞(0)

    分享創造快樂