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

8
通常当我要求线程转储时,系统性能不佳的症状很容易解释;例如,通常我可以看到许多线程明显在等待一个监视器,该监视器已被另一个线程获取但未被释放。

在这种情况下,我有很多线程在等待监视器(0x965ad100),但是似乎没有一个线程拥有该监视器。相关的线程可以通过以下标识进行识别:

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

我尝试过在Google上搜索,但似乎所有的帖子都是关于锁定的监视器,没有关于等待未锁定的监视器的信息。

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

希望这里有人可以解释我看到的内容,或者至少指引我正确的方向。谢谢提前任何回复。


顺便提一下,你最好检查一下Thread-9在做什么,因为它正在等待已经获取的相同锁(0x96560c48)。 - Grzegorz Oledzki
2个回答

1

虽然可能性较小,但在记录线程转储时,某个线程可能刚释放了监视器。 从一个监视器被释放到下一个线程获得它之间可能有一个短暂的时间段。如果您不是实际死锁,这可能可以解释您所看到的情况。尝试另一个线程转储并检查那个。

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

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


1

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

alt text


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接