例如,这是来自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?
感谢。
答案 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)
在该对象上输入同步块或方法时,对象监视器将被锁定。