我已经偶然发现了奇怪的情况,java线程转储显示线程正在等待锁定对象,但对象未被任何其他线程锁定。这里是从线程转储片段: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中出现了什么问题。
完整的线程转储将更有帮助。 – Danikov
你怎么知道没有其他线程持有锁? –
完整的线程转储是[here](http://pastebin.com/3bMZt5SV),你可以看到'0x00000000a00aea00'被锁定了。这就是为什么我认为没有其他线程持有锁。 –