在Java线程转储中,我发现了以下内容:
"TP-Processor184" daemon prio=10 tid=0x00007f2a7c056800 nid=0x47e7 waiting for monitor entry [0x00007f2a21278000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.jackrabbit.core.state.SharedItemStateManager.getNonVirtualItemState(SharedItemStateManager.java:1725)
- locked <0x0000000682f99d98> (a org.apache.jackrabbit.core.state.SharedItemStateManager)
at org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:257)
"TP-Processor137" daemon prio=10 tid=0x00007f2a7c00f800 nid=0x4131 waiting for monitor entry [0x00007f2a1ace7000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.jackrabbit.core.state.SharedItemStateManager.getNonVirtualItemState(SharedItemStateManager.java:1725)
- locked <0x0000000682f99d98> (a org.apache.jackrabbit.core.state.SharedItemStateManager)
at org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:257)
重点在于,这两个线程都锁定了监视器 <0x0000000682f99d98>(无论它们现在等待两个不同的其他监视器)。
查看线程转储分析器时,选择该监视器,底部确实显示“锁定监视器的线程:2”,并且“2个线程正在锁定”。请参见https://lh4.googleusercontent.com/-fCmlnohVqE0/T1D5lcPerZI/AAAAAAAAD2c/vAHcDiGOoMo/s971/locked_by_two_threads_3.png以获取屏幕截图,我不能在此处粘贴图像。
这是否意味着线程转储在监视器锁定信息方面不是原子的?我无法想象这真的是JVM(1.6.0_26-b03)的锁定错误。
类似的问题已经在Can several threads hold a lock on the same monitor in Java?中提出,但是对我来说,即使它们可能在等待其他问题,该答案也没有看到多个线程锁定相同监视器的真正要点。
更新于2014年5月13日:
新问题Multiple threads hold the same lock?具有重现行为的代码,@rsxg已经根据他在这里给出的答案提交了相应的错误报告https://bugs.openjdk.java.net/browse/JDK-8036823。
wait()
。如果正确,请接受。 - Graywait()
似乎非常匹配,但不幸的是那是错误的源代码... - jfrantzius