1

当我使用以下命令运行此示例时,它可以正常工作(打印为真)-XX:+DoEscapeAnalysis -server

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

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

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

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

我猜逃逸分析处理holdsLock得当(消除锁不坏holdsLock()),但我想看看一些官方参考或相关的 JVM 源代码片段。

4

1 回答 1

5

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

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

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

于 2017-12-05T16:06:57.447 回答