Java线程等待任何其他线程未持有的锁

时间:2015-10-15 13:04:49

标签: java multithreading oracle-coherence

我偶然发现了奇怪的情况,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中的错误。

1 个答案:

答案 0 :(得分:1)

有时垃圾收集和类加载会导致线程以阻塞状态显示,即使另一个应用程序线程没有持有对象监视器也是如此。 (但是,我不知道你为什么看到1.8 JVM的问题而不是1.7 JVM的问题。)

这是一个类似的问题,其中一些答案可能会提供一些线索:

Java thread dump: BLOCKED thread without "waiting to lock ..."