当我使用-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源代码片段。

最佳答案

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

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

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

10-04 20:36