Java线程等待锁定非';t(明显地)锁定

Java线程等待锁定非';t(明显地)锁定,java,multithreading,locking,monitor,dump,Java,Multithreading,Locking,Monitor,Dump,通常,当我请求线程转储时,系统性能差的症状很容易解释;i、 e.通常,我可以看到许多线程正在等待一个监视器,该监视器已被获取,但未被另一个监视器释放 在本例中,我有很多线程在等待监视器(0x965ad100),但似乎没有一个线程首先拥有该监视器。有问题的线程可以通过以下签名识别: 等待锁定(一个uk.gov.dti.og.fox.ConAgent) 我试过用谷歌搜索这个,我发现所有的帖子都在讨论被锁定的监视器,而不是等待未锁定的监视器 线程完全转储: 我希望这里的人能解释我看到的,或者至少给我指

通常,当我请求线程转储时,系统性能差的症状很容易解释;i、 e.通常,我可以看到许多线程正在等待一个监视器,该监视器已被获取,但未被另一个监视器释放

在本例中,我有很多线程在等待监视器(0x965ad100),但似乎没有一个线程首先拥有该监视器。有问题的线程可以通过以下签名识别:

等待锁定(一个uk.gov.dti.og.fox.ConAgent)

我试过用谷歌搜索这个,我发现所有的帖子都在讨论被锁定的监视器,而不是等待未锁定的监视器

线程完全转储:

我希望这里的人能解释我看到的,或者至少给我指出正确的方向。提前感谢您的回复。

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

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


如果可以将内置锁替换为,例如,
java.util.concurrent.locks.ReentrantLock
,则可以挂起程序并附加调试器,找到所关心的锁,并使用
getOwner
方法找到锁所有者。

如果使用Eclipse,您可以通过调试视图使用内置的锁查看器,这可能会有所帮助。您可以使用可通过工具栏中的向下箭头访问的下拉菜单启用它:)


顺便说一句,您最好检查线程9在做什么,因为它正在等待已经获得的锁(0x96560c48)