24

たとえば、これは Tomcat サーバーからのスタック トレースです。

    "RMI TCP Accept-0" daemon prio=10 tid=0x091a5800 nid=0x8f1 runnable [0x8b305000]
   java.lang.Thread.State: RUNNABLE
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
    - locked <0x911d3c30> (a java.net.SocksSocketImpl)
    at java.net.ServerSocket.implAccept(ServerSocket.java:462)
    at java.net.ServerSocket.accept(ServerSocket.java:430)
    at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:34)
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:369)
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:341)
    at java.lang.Thread.run(Thread.java:662)

私の推測では、「ロック」とは、CPU が何らかのロックを待機していることを意味します。しかし、その場合、スレッドの状態が BLOCKED ではなく RUNNABLE と表示されるのはなぜですか?

ありがとう。

4

2 に答える 2

33

これは、このスレッド (RMI TCP Accept-0) がハッシュ コード 0x911d3c30 (この場合はjava.net.SocksSocketImpl. このスレッドがロックを所有している間、他のスレッドはそれを所有できず、コードのこの部分 (多くの場合関数) に入ることをブロックします。詳細については、ここを参照してください。

http://download.oracle.com/javase/tutorial/essential/concurrency/newlocks.html

また、まだ実行中なので RUNNABLE です...lockedがスタックの TOP ではなく内部にあることに気付いた場合は、ロックを保持して実行を継続していることを意味します。コードのこのセクションに来る次のスレッドは、そのロックによってブロックされます。

編集これはあまりにもぎこちなくてコメントに収まらないため... これが表示された場合は、ブロックされたスレッドが表示されています。注は言うwaiting to lock

"http-80-exec-113":

at com.airs.utilities.server.Entity.serializeZip64(Entity.java:6314)
- waiting to lock <0x00007fbefe44d5c8> (a java.lang.String)
at com.airs.utilities.server.Entity.serializeZip64(Entity.java:6300)
于 2011-09-02T17:00:47.473 に答える
-1

Java 6ドキュメントから:

オブジェクトの同期ブロックまたはメソッドに入ると、オブジェクト モニターはロックされます。

于 2011-09-02T17:04:18.023 に答える