在研究大型Java Swing应用程序中的无响应性时,我发现(使用jstack)一个线程处于这种状态:
java.lang.Thread.State: BLOCKED (on object monitor)
但是,被阻塞的方法(即堆栈跟踪的顶部)没有同步,也没有进行任何锁定。它的代码就是(更改名称):
public Thing makeThing(String foo) {
return new Thing(foo);
}
Thing
构造函数仅执行以下操作。它扩展了一个类,并且基本构造函数也只分配了字段。内联初始化程序还构造了一个类。这些都不是同步的。
public Thing(String foo) {
this.foo = foo;
}
所以我不明白为什么它被阻止了。有人建议这可能与GC“停止世界”有关-但我认为JStack看不到停止世界。另外,Thing
不是Swing对象。
堆栈跟踪:
factory.makeThing
factory.makeThing
dao.retrieveThing
ThingArray.get
...
ThingCache.getThing
- locked (a java.lang.Object)
...
Thread.run