目前我们正在分析一个tomcat线程转储。在同一个线程上运行的所有线程的单个线程转储 tomcat上的时间包含以下几行:
...
"soldOutJmsConsumerContainer-1" prio=10 tid=0x00007f8409c14800 nid=0x231 in Object.wait() [0x00007f8403a9f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150)
at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216)
- locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)
...
"catalina-exec-33" daemon prio=10 tid=0x0000000041bc4000 nid=0x832 in Object.wait() [0x00007f8400f73000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150)
at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216)
- locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)
...
"catalina-exec-109" daemon prio=10 tid=0x0000000041469800 nid=0x1e87 in Object.wait() [0x00007f83f84c1000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150)
at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216)
- locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)
特别是我们不明白
- locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)
在我们的理解中,它表示当时有三个线程正在锁定同一个监视器。在我们的理解中 根据{{3}},这是不可能的。
我们对线程转储的解释是否正确?
答案 0 :(得分:10)
看起来所有这些线程都在等待与监视器关联的条件,即它们调用该监视器的wait()
方法。
当线程在它拥有的监视器上调用wait()
时,它会临时释放监视器,并在从wait()
返回时需要重新获取它。因此,您可以拥有多个用于拥有监视器的线程,但现在正在等待wait()
方法。
答案 1 :(得分:2)
什么意思是“ - 锁定&lt; 0x00007f847612c820&gt;(com.tc.object.RemoteObjectManagerImpl)”。
这意味着它位于该锁的同步块内。可以使用WAITING(在这种情况下,另一个线程可以获取/保持锁定,或者RUNNING,在这种情况下它可以保持锁定。
答案 2 :(得分:1)
这些线程等待获取锁定,而不是持有锁。
答案 3 :(得分:0)
没有不同的线程无法锁定相同的对象。其他人持有锁,转储中的所有线程都在等待锁定。