Java 堆栈跟踪中的“锁定”是什么意思?

2022-09-01 20:53:29

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

谢谢。


答案 1

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

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

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

编辑因为这太尴尬了,不适合评论...如果您看到 THIS,则表示您看到的线程被阻止。注意是说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)

答案 2

来自 java 6 文档

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