2015-10-15 83 views
2

我已经偶然发现了奇怪的情况,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中出现了什么问题。

+1

完整的线程转储将更有帮助。 – Danikov

+0

你怎么知道没有其他线程持有锁? –

+0

完整的线程转储是[here](http://pastebin.com/3bMZt5SV),你可以看到'0x00000000a00aea00'被锁定了。这就是为什么我认为没有其他线程持有锁。 –

回答

1

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

这里有一些答案,类似的问题可能会提供一些线索:

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

+0

如果是这样的话,那么线程在GC之后不会被解除阻塞? –