有人帮助我使用挂起的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条件变量。
答案 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