当我使用-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源代码片段。
答案 0 :(得分:5)
Thread.holdsLock
是JDK中的native方法,它不是JVM intrinsic。
这意味着,Thread.holdsLock
的实现是JIT编译器的黑盒子。由于此方法接受lock
作为参数,因此lock
不能再被视为本地不可转义的对象。 JVM肯定知道lock
确实逃脱了,因此在这个例子中,分配和同步都不会被消除。
但是,正如@Holger所注意到的,即使holdsLock
是JVM内在函数,它也不应该返回false
,否则这将违反规范。没有JVM优化可能会破坏程序的正确性。