【发布时间】:2012-03-21 04:09:40
【问题描述】:
在 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)
这里的重点是两个线程都锁定了监视器(不管它们现在等待两个不同的其他监视器)。
查看线程转储分析器时,选择了该监视器,它实际上在底部显示“线程锁定监视器: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。
【问题讨论】:
-
对我的回答有什么反馈吗?我对其进行了编辑以指出更高版本的代码在第 1725 行有一个
wait()。如果这是正确的,请接受。 -
我们使用的是 Jackrabbit 版本 1.6.5。我的一个朋友也在 2.3.6 版本的同一行号上看到了
wait(),因为它看起来非常匹配,但不幸的是,源代码是错误的......
标签: java multithreading concurrency locking