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

pal*_*int 1 java jvm escape-analysis

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

final Object lock = new Object();
synchronized (lock) {
    System.out.println(Thread.holdsLock(lock)); // prints true
}
Run Code Online (Sandbox Code Playgroud)

另一方面,简短且不太详细的Java HotSpot™虚拟机性能增强文档说明如下:

服务器编译器还消除了所有非全局转义对象的锁.

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

我想逃避分析处理holdsLock得当(消除锁没有破坏holdsLock())但我想看一些官方参考或可能相关的JVM源代码片段.

apa*_*gin 5

Thread.holdsLock是JDK中的本机方法,它不是JVM内在的.

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

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