当我使用-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优化可能会破坏程序的正确性。