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

通常,当我要求进行线程转储时,很容易解释性能不佳系统的症状;也就是说,通常我会看到许多线程正在等待已经获得但未被另一个人释放的监视器上.

在这种情况下,我有很多线程在等待监视器(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线程等待锁定没有(明显)锁定的对象 - 代码日志