逃逸分析是否正确处理 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.holdsLock
是 native method in JDK, and it is not a JVM intrinsic.
这意味着,Thread.holdsLock
的实现是 JIT 编译器的黑盒。由于此方法接受 lock
作为参数,因此 lock
不能再被视为局部不可转义对象。 JVM 肯定知道 lock
会转义 ,因此在这个例子中既不会消除分配也不会消除同步。
但是,正如@Holger 所注意到的,即使 holdsLock
是一个 JVM 内在函数,它也不应该 return false
,否则这将违反规范。没有 JVM 优化可能会破坏程序的正确性。
当我 运行 使用 -XX:+DoEscapeAnalysis -server
:
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.holdsLock
是 native method in JDK, and it is not a JVM intrinsic.
这意味着,Thread.holdsLock
的实现是 JIT 编译器的黑盒。由于此方法接受 lock
作为参数,因此 lock
不能再被视为局部不可转义对象。 JVM 肯定知道 lock
会转义 ,因此在这个例子中既不会消除分配也不会消除同步。
但是,正如@Holger 所注意到的,即使 holdsLock
是一个 JVM 内在函数,它也不应该 return false
,否则这将违反规范。没有 JVM 优化可能会破坏程序的正确性。