在Java threaddump中,我发现了以下内容:
"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)
Run Code Online (Sandbox Code Playgroud)
这里的重点是两个线程都锁定了监视器<0x0000000682f99d98>(无论它们现在正在等待两个不同的其他监视器).
在查看Thread Dump Analyzer时,如果选择了该监视器,它实际上会在底部显示"Threads locking monitor:2",并且"2 Threads s slock".有关屏幕截图,请参阅https://lh4.googleusercontent.com/-fCmlnohVqE0/T1D5lcPerZI/AAAAAAAAD2c/vAHcDiGOoMo/s971/locked_by_two_threads_3.png,我不允许在此处粘贴图片.
这是否意味着关于监视器锁定信息,threaddumps不是原子的?我无法想象这真的是JVM的锁定错误(1.6.0_26-b03).
类似的问题已经在几个线程中被问到可以锁定Java中的同一个监视器吗?,但我的答案并没有看到多个线程锁定同一个监视器的真正意义,即使他们可能正在等待其他一些.
2014年5月13日更新:
更新的问题多个线程持有相同的锁?有代码重现行为,@ rssx已根据他的答案提交了一份相应的错误报告https://bugs.openjdk.java.net/browse/JDK-8036823.