【发布时间】:2012-06-29 16:36:51
【问题描述】:
JVM 告诉我发生了死锁:
Found one Java-level deadlock:
=============================
"TP-Processor107":
waiting for ownable synchronizer 0x00002aaaf58e70f0, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),
which is held by "indexTrackerThread3"
"indexTrackerThread3":
waiting for ownable synchronizer 0x00002aaaf4394580, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),
which is held by "TP-Processor16"
"TP-Processor16":
waiting for ownable synchronizer 0x00002aaaf58e70f0, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),
which is held by "indexTrackerThread3"
我们可以看到indexTrackerThread3 正在等待TP-Processor16 持有的资源,反之亦然。这确实是一个僵局。
我们可以看到indexTrackerThread3正在等待0x00002aaaf4394580:
"indexTrackerThread3":
- parking to wait for <0x00002aaaf4394580>
我的问题:
在the threads dump,为什么没有- locked <0x00002aaaf4394580>行?
似乎 0x00002aaaf58e70f0 实际上没有被任何线程锁定。是什么锁定了它?
在我阅读过的所有死锁文档 (example) 中,对于每一不同的 - parking to wait for <0x123> 行,总是有一个 - locked <0x123> 行。所以我开始怀疑是 JVM 错误。我是不是误会了什么?
注意:很抱歉链接到 pastebin,但如果没有完整的转储,这个问题是无法回答的。为简洁起见,我删除了所有包含“at”的行,它们不包含任何锁定信息。
【问题讨论】:
标签: java multithreading thread-safety jvm deadlock