小编jfr*_*ius的帖子

多个Java线程似乎锁定了同一个监视器?

在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.

java concurrency multithreading locking

11
推荐指数
1
解决办法
5711
查看次数

标签 统计

concurrency ×1

java ×1

locking ×1

multithreading ×1