Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一种不需要';对象监视器上的t锁被阻止_Java_Multithreading_Garbage Collection_Monitor - Fatal编程技术网

Java 一种不需要';对象监视器上的t锁被阻止

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 Swing应用程序的无响应性时,我发现(使用jstack)有一个线程处于这种状态:

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