【发布时间】:2011-11-22 23:53:44
【问题描述】:
我遇到了我的程序挂起的情况,看起来像死锁。但是我尝试使用 jconsole 和 visualvm 来解决这个问题,但他们没有检测到任何死锁。示例代码:
public class StaticInitializer {
private static int state = 10;
static {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
state = 11;
System.out.println("Exit Thread");
}
});
t1.start();
try {
t1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("exiting static block");
}
public static void main(String...strings) {
System.out.println(state);
}
}
当我在调试模式下执行此操作时,我可以看到控制到达 @覆盖 公共无效运行(){ 状态 = 11;
但是一旦 state=11 被执行,它就会挂起/死锁。我查看了 stackoverflow 中的不同帖子,我认为静态初始化程序是线程安全的,但在这种情况下 jconsole 应该报告这一点。关于主线程,jconsole 说它处于等待状态,没关系。但是对于在静态初始化块中创建的线程,jconsole 说它处于 RUNNABLE 状态并且没有被阻塞。我很困惑,这里缺乏一些概念。请帮帮我。
【问题讨论】:
-
很好的问题,为什么线程在 join() 期间可以运行。显然是 WAITING,所以这将是一个更合适的状态。
-
实际上,javadoc 说它应该处于 WAITING 状态:download.oracle.com/javase/6/docs/api/java/lang/…
-
这很有趣。我来到这里是因为我使用 scala 工作表进行了一些编程,mail.google.com/mail/u/0/#inbox/1472a9cccdc4ffbd 这是一个非常酷的范例,它允许在您键入时在线显示计算结果。然而,这意味着所有工作都在静态初始化程序中完成。你能谴责吗?
标签: java multithreading deadlock static-initializer