"发现1死锁"但跟踪显示未被任何线程锁定

Nic*_*oul 6 java multithreading deadlock jvm thread-safety

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"
Run Code Online (Sandbox Code Playgroud)

我们可以看到,indexTrackerThread3正在等待所持有的资源TP-Processor16,反之亦然.这确实是一个僵局.

我们可以看到indexTrackerThread3等待0x00002aaaf4394580:

"indexTrackerThread3":
    - parking to wait for  <0x00002aaaf4394580>
Run Code Online (Sandbox Code Playgroud)

我的问题:

线程转储中,为什么没有线- locked <0x00002aaaf4394580>

似乎0x00002aaaf58e70f0实际上没有被任何线程锁定.什么可以锁定它?

在我读过的所有死锁文档中(示例),对于每个不同的- parking to wait for <0x123>行,总有- locked <0x123>一行.所以我开始怀疑JVM错误.我误会了什么吗?

注意:很抱歉链接到pastebin,但如果没有完整的转储,问题就无法回答.为简洁起见,我删除了包含"at"的所有行,它们不包含任何锁定信息.

Mar*_*nik 5

java.util.concurrent 包利用了一种语言外的本机停放机制(以及其他本机机制,例如原子比较和交换)。你可以在这里看到我在说什么。

您所描述的线程转储中通常出现的模式源于经典的 Java 习惯用法synchronized(lock) { lock.wait(); }