Ben*_*Ben 6 java multithreading locking dump monitor
通常,当我要求进行线程转储时,很容易解释性能不佳系统的症状; 也就是说,通常我会看到许多线程正在等待已经获得但未被另一个人释放的监视器上.
在这种情况下,我有很多线程在等待监视器(0x965ad100),但似乎没有一个线程首先拥有该监视器.可以使用此签名标识有问题的线程:
等待锁定<0x965ad100>(a uk.gov.dti.og.fox.ConAgent)
我已经尝试了谷歌搜索,我似乎找到的所有内容都是讨论被锁定的监视器,没有关于等待未锁定的监视器的信息.
线程转储完整:http://www.basson.at/docs/stackoverflow/thread_dump.txt
我希望这里有人可以解释我所看到的,或者至少指出我正确的方向.提前感谢您的回复.
当线程转储被获取时,线程有可能(尽管不太可能)刚刚释放了监视器。释放监视器和下一个线程获取它之间可能有一个短暂的时间段。如果您没有陷入实际的僵局,这可以解释您所看到的情况。尝试另一个线程转储并检查该线程转储。
更有可能的是,某个地方有一个线程已经持有监视器。有时并不明显。您的堆栈跟踪有一些“锁定”行,其中列出了持有某些锁的线程,但该列表不一定完整。例如,我怀疑通过 JNI 获取的锁未列出。
如果您可以用例如替换内置锁,那么java.util.concurrent.locks.ReentrantLock
您可以挂起程序并附加调试器,找到您关心的锁,并使用该getOwner
方法找到锁所有者。