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 正在等待某种锁定。但是,如果是这样,为什么线程的状态被列为 RUNNABLE 而不是 BLOCKED?

谢谢。

4

2 回答 2

33

这意味着该线程(RMI TCP Accept-0)拥有哈希码为 0x911d3c30 的对象的所有权,在本例中为 a java.net.SocksSocketImpl。虽然这个线程拥有锁,但没有其他线程可以拥有它,从而阻止它们进入这部分代码(通常是一个函数)。请参阅此处了解更多信息:

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

此外,它是 RUNNABLE 因为它仍在运行......如果您注意到它locked不在堆栈的顶部而是在堆栈内部,这意味着它持有锁并继续执行。这部分代码的下一个线程将被该锁阻塞。

编辑因为这太尴尬了,无法放入评论中......如果您看到这个,您会看到一个被阻止的线程。注意是说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 回答