2012-01-19 8 views
4

現在、Tomcatスレッドダンプを解析しています。それは3つのスレッドが保持していると言う、我々は我々の理解で複数のスレッドがJavaの同じモニターでロックを保持できますか?

- locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl) 

を理解していない。特に

... 
"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) 

:Tomcatで同じ 時点で実行されているすべてのスレッドのシングルスレッドダンプは、次の行が含まれていますその時の同じモニターへのロック。私たちの理解では とJLSによるとこれはできません。

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

答えて

10

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

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

+0

+1しかし...あなたは説明できますかなぜこれは他のすべての回答と同じではないのですか?彼らが状態を待っている場合は、モニターをリリースして、それを再び取得しようとしています。これは結局、他のすべての回答とまったく同じではありませんか? – NoozNooz42

+0

@ NoozNooz42:これらのスレッドに通知され、現在モニターの再取得を待っている可能性がありますが、それはおそらくそうはありません。これらのスレッドがまだ通知されておらず、代わりに通知されるのを待っている可能性が高いという点を強調したいと思います。 – axtavt

+2

@axtavtスレッドが再獲得を待っている可能性はありません。彼らが状態を再獲得するのを待っていたならば、「待ち」ではなく「ブロックされています」 – Dev

0

異なるスレッドは同じオブジェクトにロックを保持できません。誰かがロックを保持していて、ダンプ内のすべてのスレッドがそのロックを待っています。

1

これらのスレッドは、ロックを保持しないでロックを取得するためにを待ってです。

+0

-1。待機中の状態で待機中です。ロックを取得するのと同じこと – axtavt

+0

この解釈が正しいかどうかわからないRemoteObjectManagerImpl#basicRetrieve()が同期されているスタックトレースを読み取らなければならないスタックトレースは以下を示します:1)synchronizedメソッド内IDが0x00007f847612c820のモニターはロックを保持しています。それから、waitUntilRunningにジャンプし、そこではObject#wait()で待機します。はい、彼らはオブジェクトを待っていますが、それらのすべてが同期メソッドを通過しました。テラコッタは関与しているので、テラコッタのバグだと思われます。ですから、私たちの質問は、「ロックされた<0x00007f847612c820>(com.tc.object.RemoteObjectManagerImpl)」という意味です。 – Lars

+0

@axtavtロックを取得できない場合、スレッドはブロックされています。スレッドはwait()メソッド内にあるときのみ待ちます。 http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html –

2

「ロックされた< 0x00007f847612c820>(com.tc.object.RemoteObjectManagerImpl)」とはどういう意味ですか?

これは、そのロック用の同期ブロック内にあることを意味します。 WAITING(この場合は、別のスレッドがロックを取得/保持でき、その場合ロックを保持している場合)

+0

が同意します。私はそれをモニタ上で待つことを意味すると解釈する – Toby

関連する問題