逃逸分析是否正确处理 Thread.holdsLock()?

Does escape analysis handles Thread.holdsLock() properly?

当我 运行 使用 -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 文档说明如下:

The server compiler also eliminates locks for all non-globally escaping objects.

因此,如果逃逸分析消除了这里不必要的同步,它应该打印 false.

我想逃逸分析可以正确处理 holdsLock(消除锁不会损坏 holdsLock()),但我希望看到一些官方参考资料或相关的 JVM 源代码片段。

Thread.holdsLocknative method in JDK, and it is not a JVM intrinsic.

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

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