我偶然发现了奇怪的情况,java线程转储显示一个线程正在等待锁定一个对象,但是对象没有被任何其他线程锁定。这是来自线程转储的片段:
"PacketPublisher" #18 daemon prio=10 os_prio=2 tid=0x0000000059adf800 nid=0x1ca0 waiting for monitor entry [0x000000005bbce000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.tangosol.coherence.component.net.socket.UdpSocket.send(UdpSocket.CDB:21)
- waiting to lock <0x00000000a00aea00> (a java.net.DatagramPacket)
at com.tangosol.coherence.component.net.PacketBundle.send(PacketBundle.CDB:1)
at com.tangosol.coherence.component.util.daemon.queueProcessor.packetProcessor.PacketPublisher.onPacket(PacketPublisher.CDB:87)
at com.tangosol.coherence.component.util.daemon.queueProcessor.packetProcessor.PacketPublisher.onNotify(PacketPublisher.CDB:44)
at com.tangosol.coherence.component.util.Daemon.run(Daemon.CDB:51)
at java.lang.Thread.run(Thread.java:745)
在threaddump中,0x00000000a00aea00
对象上没有其他锁定。怎么可能?
背景:这是在JDK 1.8u60上运行的Coherence 12.1.3应用程序。这种情况不是暂时的,当我做更多的线程转储时,这个线程仍然被阻止。我必须重新启动应用程序以使其再次运行,并且有时它可以无阻塞地运行,因此它不具有确定性。我也无法在JDK 1.7u79上重现它。如果你可以解释一个线程如何永远等待未被锁定的对象,那么我可以找出我的应用程序或Coherence中的错误。
答案 0 :(得分:1)
有时垃圾收集和类加载会导致线程以阻塞状态显示,即使另一个应用程序线程没有持有对象监视器也是如此。 (但是,我不知道你为什么看到1.8 JVM的问题而不是1.7 JVM的问题。)
这是一个类似的问题,其中一些答案可能会提供一些线索:
Java thread dump: BLOCKED thread without "waiting to lock ..."