“锁定”在Java堆栈跟踪中意味着什么?

时间:2011-09-02 16:57:02

标签: java stack locked

例如,这是来自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?

感谢。

2 个答案:

答案 0 :(得分:25)

这意味着此线程(RMI TCP Accept-0)拥有对象的所有权,哈希代码为0x911d3c30,在本例中为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)

答案 1 :(得分:-1)

来自java 6 documentation

  

在该对象上输入同步块或方法时,对象监视器将被锁定。