如果在静态初始值设定项块中创建线程,则程序挂起
我遇到了一种情况,我的程序挂起,看起来像死锁。但是我尝试用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);
}
}
当我在调试模式下执行此命令时,我可以看到控制达到@Override公共 void run() { state = 11;
但是一旦执行 state=11,它就会挂起/死锁。我在stackoverflow中查看了不同的帖子,我认为静态初始值设定项是线程安全的,但在这种情况下,jconsole应该报告这一点。关于主线程,jconsole说它处于等待状态,这很好。但是对于在静态初始值设定项块中创建的线程,jconsole 表示它处于 RUNNABLE 状态且未被阻塞。我很困惑,这里缺乏一些概念。请帮帮我。