【发布时间】:2017-12-06 00:06:57
【问题描述】:
当我使用-XX:+DoEscapeAnalysis -server 运行此示例时,它运行良好(打印结果为真):
final Object lock = new Object();
synchronized (lock) {
System.out.println(Thread.holdsLock(lock)); // prints true
}
另一方面,简短且不太详细的 Java HotSpot™ Virtual Machine Performance Enhancements 文档说明如下:
服务器编译器还消除了所有非全局转义对象的锁。
所以,如果逃逸分析消除了这里不必要的同步,它应该打印false。
我猜逃逸分析可以正确处理holdsLock(消除锁不会破坏holdsLock()),但我希望看到一些官方参考或相关的JVM源代码sn-ps。
【问题讨论】:
-
此代码应该永远打印
false。只有在不改变代码语义的情况下才允许进行优化。如果 JVM 决定消除锁,此时它还负责将Thread.holdsLock(lock)替换为常量true。没有必要引用源代码来支持不允许优化更改语义的基本属性。除此之外,还有不止一个实现,所以引用其中一个的源代码无论如何都不能作为证明。当您调用Thread.holdsLock(lock)... 时,JVM 也可能决定不进行优化...
标签: java jvm escape-analysis