等待锁定未(明显)锁定的对象的 Java 线程

标签 java multithreading locking monitor dump

通常当我请求线程转储时,系统性能不佳的症状很容易解释;也就是说,通常我会看到许多线程显然正在等待一个已被获取但未被另一个释放的监视器。

在这种情况下,我有很多线程在等待监视器 (0x965ad100),但似乎没有一个线程首先拥有该监视器。有问题的线程可以用这个签名来识别:

waiting to lock <0x965ad100> (a uk.gov.dti.og.fox.ConAgent)

我试过用谷歌搜索这个,我似乎找到的都是讨论锁定监视器的帖子,没有关于等待未锁定监视器的帖子。

完整的线程转储:http://www.basson.at/docs/stackoverflow/thread_dump.txt

我希望这里有人可以解释我所看到的,或者至少为我指明正确的方向。预先感谢您的任何回复。

最佳答案

有可能(尽管不太可能)线程在获取线程转储时刚刚释放了监视器。在释放监视器和下一个线程获取它之间可能有一段短暂的时间。如果您没有真正陷入僵局,这可以解释您所看到的情况。尝试另一个线程转储并检查那个线程转储。

更有可能的是,某处已经有一个线程已经持有监视器。有时并不明显。您的堆栈跟踪有一些“锁定”行,其中列出了持有某些锁的线程,但该列表不一定完整。例如,我怀疑未列出通过 JNI 获得的锁。

如果你可以更换内置锁,例如java.util.concurrent.locks.ReentrantLock,然后你可以暂停程序并附加调试器,找到你关心的锁,并使用 getOwner 找到锁的所有者方法。

关于等待锁定未(明显)锁定的对象的 Java 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4174560/

相关文章:

.net - 何时在 ForEach 循环中获取属性?

java - 在java中创建多维HashMap

java - Java HTTP 请求的简写回调

c++ - 为什么在Release模式下的while循环中我无法逃脱?

java - ReentrantReadWriteLock 上的读锁是否足以并发读取 RandomAccessFile

Java 应用程序在调用PreparedStatement(针对 SQL Server DB)后挂起

java - 实现远程代理

java - 我可以在 setter 方法中编写验证逻辑吗?

objective-c - dipatch_async 释放局部变量

java - BlockingQueue 对于实现生产者/消费者系统有用吗?