默认情况下,使用Hotspot,CTRL-Break线程转储不会列出哪些线程持有java.lang.concurrent
锁。我了解到,对于这些锁,Hotspot无法获得锁在哪个堆栈帧上被获取的信息。如果您添加JVM选项-XX:+PrintConcurrentLocks
,那么CTRL-Break堆栈转储将在线程的堆栈跟踪后列出该帧持有的任何并发锁。例如:
"D-Java-5-Lock" prio=6 tid=0x00000000069a1800 nid=0x196c runnable [0x000000000770f000]
java.lang.Thread.State: RUNNABLE
at com.Tester.longDelay(Tester.java:41)
at com.Tester$D.run(Tester.java:88)
Locked ownable synchronizers:
- <0x00000007d6030898> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
如果没有此选项,则无法在事后确定哪个线程持有此锁。为什么这个选项不是默认的呢?是否存在某些非明显的性能或稳定性惩罚?当我搜索以找到关于此的讨论时,没有任何结果。