0

有人帮我处理挂起的 Java 服务器研究了线程转储,但不了解以下状态:

信息 | 虚拟机 1 | 2009/08/30 18:11:46 | “103468119@qtp-2047706572-1”prio=10 tid=0x0000000041758000 nid=0x13d7 等待条件 [0x00007f6dbb75e000]
信息 | 虚拟机 1 | 2009/08/30 18:11:46 | java.lang.Thread.State:可运行
信息 | 虚拟机 1 | 2009/08/30 18:11:46 | 在 java.net.PlainSocketImpl.isConnectionReset(PlainSocketImpl.java:602)
信息 | 虚拟机 1 | 2009/08/30 18:11:46 | - 锁定(一个 java.lang.Object)

代码正在运行

java版本“1.6.0_14”
Java(TM) SE 运行时环境 (build 1.6.0_14-b08)
Java HotSpot(TM) 64 位服务器 VM(内部版本 14.0-b16,混合模式)

确实,根据PlainSocketImpl源码,即使有内部同步,应该也不可能长时间停留在isConnectionReset()方法中:

public boolean isConnectionReset() {
   synchronized (resetLock) {
      return (resetState == CONNECTION_RESET);
   }
}

无论如何,如果线程被锁阻塞,它的状态将是 BLOCKED。处于 RUNNABLE 状态“等待条件”的线程意味着线程正在等待内部 VM 条件变量。

4

1 回答 1

0

有无数种方法可以创建您描述的情况,但总的主题是“以不同的顺序获取两个或多个锁”。

 |  other thread                    your thread
 | 
 |  acquire resetLock                    x 
 |      x                                x
t|      x                         acquire fooLock
i|      x                                x
m|  attempt to acquire fooLock           x
e|  BLOCKED                              x
 |                                       x
 |                                       x 
 |                             attempt to acquire resetLock
 |                                     BLOCKED  <-- your dump
 |    
 v      
于 2009-10-04T00:31:07.653 回答