class A {
static final int i;
static {
i = 128;
Thread t = new Thread() {
public void run() {
System.out.println("i=" + i);
}
};
t.start();
try {
t.join();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
public class MainTesting {
public static void main(String[] args) {
A a = new A();
System.out.println("finish");
}
}
我从来没有得到过finish
打印出 i 的值。
为什么会这样呢?
您从线程 1(“主”线程)开始,并开始执行该线程的静态初始化程序A
class.
在该静态初始化程序中,然后启动一个新线程 (2),该线程使用A
班级。这意味着线程 2 需要等待,直到A
类在继续之前已完成初始化,按照JLS 第 12.4.2 节 http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4.2:
如果 C 的 Class 对象指示其他线程正在进行 C 的初始化,则释放 LC 并阻塞当前线程,直到通知正在进行的初始化已完成,此时重复此步骤。
但是,您的静态初始化程序A
等待线程 2 完成(通过调用join()
) 前it完成,导致死锁:静态初始化程序在线程 2 完成之前无法完成,而线程 2 在静态初始化程序完成之前无法完成...
结果:不要这样做:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)