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)

私たちの理解では、3つのスレッドがその時点で同じモニターにロックを保持していると言います。私たちの理解とJLSによると、これは不可能です。

スレッドダンプの解釈は正しいですか?

4

4 に答える 4

10

これらのスレッドはすべて、モニターに関連付けられた状態を待機しているようです。つまり、wait()そのモニターのメソッドを呼び出しています。

スレッドがwait()所有するモニターを呼び出すと、一時的にモニターを解放し、から戻るときにモニターを再取得する必要がありwait()ます。wait()したがって、以前はモニターを所有していたが、現在はメソッドで待機している複数のスレッドを持つことができます。

于 2012-01-19T12:51:57.107 に答える
2

「-locked<0x00007f847612c820>(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 に答える