java - "Found 1 deadlock"但跟踪显示未被任何线程锁定

标签 java multithreading thread-safety jvm deadlock

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.util.concurrent 包利用语言外的本地停放机制(以及其他本地机制,例如原子比较和交换)。你可以看到我在说什么here .

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

关于java - "Found 1 deadlock"但跟踪显示未被任何线程锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11239883/

相关文章:

java - 表面有随机点的 3d 球

java - Delombok 找不到所有依赖项的符号

java - Oracle ADF : Lifecycle method calls taking long time when ViewCriteria execute "in memory" mode

java - 如何循环遍历图形的顶点,而不是为每个顶点使用单独的 add.vertex ?

c++ - 使用方法指针启动线程

java - 中断等待用户输入的线程,然后退出应用程序

swift - 跨线程重用 View Controller 实例

JavaFX 和多线程 : IllegalStateException on ObservableList. add()

python - 使 Python unittest 因任何线程的异常而失败

c# - Windows 窗体同步和调度程序同步之间有什么区别?