欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
  导语:锁消除是Java虚拟机在JIT编译期间,通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁,通过锁消除,可以节省毫无意义的请求锁时间。本文作者举例说明了锁消除,并分析了锁消除的条件,本文适合对于深入了解JVM有兴趣的开发者。
 
  问题:
 
  我听说JVM会对锁进行优化,所以如果我写了synchronized,JVM会帮我做优化!对吗
 
  理论:
 
  在当前Java内存模型中,未观察到的锁不能保证具有任何效果。另外,这意味着在非共享对象上进行同步是无效的,因此runtime可以啥也不做。同步有可能是不需要的,这为优化提供了机会。
 
  因此,如果逃逸分析发现对象是非逃逸的,编译器就可以自行消除同步。
 
  测试:
 
  考虑如下JMH基准测试:
 
  如果我们运行此测试并启用-prof perfnorm profiler,将看到:
 
  执行结果完全相同。这意味着生成的代码是相同的。生成的代码是这样:
 
  锁完全被消除了。如果我们使用jvm参数-xx:-eliminateLocks,或者使用-xx:-doescapeanalysis禁用EA(这会破坏依赖EA的每个优化,包括锁消除),则锁计数器将膨胀:
 
  显示了两种方式的开销对比。
 
  结论:
 
  锁消除是由于逃逸分析带来的优化,它消除了多余的同步。当内部同步代码没有逃逸到外部时,runtime就可以完全消除同步了。

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h63078.shtml