4

目前我们正在分析一个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)

在我们的理解中,它表示当时三个线程正在对同一个监视器持有一个锁。根据我们的理解和JLS的说法,这是不可能的。

我们对线程转储的解释是否正确?

4

4 回答 4

10

看起来所有这些线程都在等待与监视器相关的条件,即它们调用wait()了该监视器的方法。

当线程调用wait()它所拥有的监视器时,它会暂时释放监视器,并在从wait(). 因此,您可以拥有多个线程,这些线程曾经拥有一个监视器,但现在正在等待wait()方法。

于 2012-01-19T12:51:57.107 回答
2

什么意思是“-locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)”。

这意味着它在该锁的同步块内。它可以是 WAITING (在这种情况下另一个线程可以获取/持有锁,或者 RUNNING 在这种情况下它持有锁。

于 2012-01-19T13:22:21.397 回答
1

那些线程正在等待获取锁,而不是持有锁。

于 2012-01-19T12:47:55.033 回答
0

没有不同的线程不能对相同的对象持有锁。其他人持有该锁,转储中的所有线程都在等待该锁。

于 2012-01-19T12:47:20.243 回答