Java 一种不需要';对象监视器上的t锁被阻止
在调查大型Java Swing应用程序的无响应性时,我发现(使用jstack)有一个线程处于这种状态:Java 一种不需要';对象监视器上的t锁被阻止,java,multithreading,garbage-collection,monitor,Java,Multithreading,Garbage Collection,Monitor,在调查大型Java Swing应用程序的无响应性时,我发现(使用jstack)有一个线程处于这种状态: java.lang.Thread.State: BLOCKED (on object monitor) 但是,它被阻止的方法(即在堆栈跟踪的顶部)不同步,也不执行任何锁定。其代码仅为(名称已更改): 东西构造函数只执行以下操作。它扩展了一个类,并且基构造函数也只分配字段。还有一个类是由内联初始值设定项构造的。这些都不是同步的 public Thing(String foo) { th
java.lang.Thread.State: BLOCKED (on object monitor)
但是,它被阻止的方法(即在堆栈跟踪的顶部)不同步,也不执行任何锁定。其代码仅为(名称已更改):
东西
构造函数只执行以下操作。它扩展了一个类,并且基构造函数也只分配字段。还有一个类是由内联初始值设定项构造的。这些都不是同步的
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
请记住:您有一个名为Thing的方法?那不是一个构造函数?那个代码片段看起来很奇怪。如果代码确实正确,您应该学习如何在Java中正确命名方法。名字应该有意义。方法名包含一个动词和小写开头。如果这是一个构造函数调用,而您忘记了new关键字。。。我倾向于gc问题。然后让某人下一步分析gc日志文件。@GhostCat-添加了缺少的“新”。生产代码使用正确的命名。“
Thread
”和“Swing”是一个很大的危险信号-您知道Swing是单线程的吗?不能从EDT以外的任何线程访问或修改Swing对象?这样做的结果正是您正在经历的行为。您是否使用任何AOP或字节码重写功能?可能实际执行(和阻塞)的makeThing
不是您有源代码的makeThing
。
factory.makeThing
factory.makeThing
dao.retrieveThing
ThingArray.get
...
ThingCache.getThing
- locked (a java.lang.Object)
...
Thread.run