转义分析是否正确处理Thread.holdsLock()?

时间:2017-12-05 13:08:53

标签: java jvm escape-analysis

当我使用-XX:+DoEscapeAnalysis -server运行它时,此示例正常工作(打印为true):

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源代码片段。

1 个答案:

答案 0 :(得分:5)

Thread.holdsLock是JDK中的native方法,它不是JVM intrinsic

这意味着,Thread.holdsLock的实现是JIT编译器的黑盒子。由于此方法接受lock作为参数,因此lock不能再被视为本地不可转义的对象。 JVM肯定知道lock 确实逃脱了,因此在这个例子中,分配和同步都不会被消除。

但是,正如@Holger所注意到的,即使holdsLock是JVM内在函数,它也不应该返回false,否则这将违反规范。没有JVM优化可能会破坏程序的正确性。