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

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)

    分享創造快樂