Fra*_*osa 17 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)
Run Code Online (Sandbox Code Playgroud)
我的猜测是"锁定"意味着CPU正在等待某种锁定.但是,如果是这种情况,为什么线程的状态列为RUNNABLE而不是BLOCKED?
谢谢.
jos*_*row 25
这意味着该线程(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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7321 次 |
| 最近记录: |