我的线程如何陷入isConnectionReset(PlainSocketImpl)

时间:2009-09-06 12:46:56

标签: java sockets jdk1.6

有人帮助我使用挂起的Java服务器研究了线程转储并且不了解以下状态:

INFO   | jvm 1    | 2009/08/30 18:11:46 | "103468119@qtp-2047706572-1" prio=10 tid=0x0000000041758000 nid=0x13d7 waiting on condition [0x00007f6dbb75e000]
INFO   | jvm 1    | 2009/08/30 18:11:46 |    java.lang.Thread.State: RUNNABLE
INFO   | jvm 1    | 2009/08/30 18:11:46 |     at java.net.PlainSocketImpl.isConnectionReset(PlainSocketImpl.java:602)
INFO   | jvm 1    | 2009/08/30 18:11:46 |     - locked  (a java.lang.Object)

代码正在

中运行
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)

实际上,根据PlainSocketImpl源代码,即使使用内部同步,也不可能在isConnectionReset()方法中保留很长时间:

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

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

1 个答案:

答案 0 :(得分: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