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