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>
我的问题:
在线程转储中,为什么没有- locked <0x00002aaaf4394580>
这一行?
似乎实际上没有任何线程锁定0x00002aaaf58e70f0。是什么导致它被锁定?
在我读过的所有死锁文档(示例)中,对于每个不同的- parking to wait for <0x123>
行,总会有一个- locked <0x123>
行。所以我开始怀疑是否出现了JVM bug。我是否理解错了什么?
注:很抱歉链接到pastebin,但如果没有完整的转储,无法回答这个问题。为简洁起见,我删除了所有包含“ at”的行,它们不包括任何锁信息。