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,由方圆翻译。转载本文请注明出处,欢迎更多小伙伴加入翻译及投稿文章的行列,详情请戳公众号菜单「联系我们」。
参考阅读:
- 为何服务器QPS上不去?Java线程调优权威指南
- 未来架构| 云原生时代的分布式事务
- 5分钟了解Java 12 八大新特性
- SlimTrie:战胜Btree单机百亿文件的极致索引-实现篇
- Java性能优化指南及唯品会的实战
技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。转载请注明来自高可用架构「ArchNotes」微信公众号及包含以下二维码。
高可用架构
改变互联网的构建方式
标签:10,同步,Java,代码,逃逸,优化,消除 来源: https://blog.51cto.com/14977574/2546619
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。