无法锁定的方法在对象监视器上被阻止

时间:2018-06-22 16:42:04

标签: java multithreading garbage-collection monitor

在研究大型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

0 个答案:

没有答案