2015-10-15 80 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之後不會被解除阻塞? –