http://mp.weixin.qq.com/s/UwEO8hFq-EL3a_VjMRydkA
class A{
static {
String a="a init";
System.out.println(a);
B.testB();
System.out.println("init A --> B.testB();");
}
public static void testA(){
System.out.println("a.testA");
}
}
class B{
static {
String b="b init";
System.out.println(b);
A.testA();
System.out.println("init B --> A.testA();");
}
public static void testB(){
System.out.println("b.testB");
}
}
public class TestAB {
public static void main(String[] args) {
// 单线程有可重入性,所以不会死锁
// 多线程在执行<clinit> 时,会死锁。
new Thread(() -> A.testA()).start();
new Thread(() -> B.testB()).start();
}
}
当有个线程正在执行这个类的clinit方法的时候,就会设置这个类的状态为being_initialized,
当正常执行完之后就马上设置为fully_initialized,然后才唤醒其他也在等着对其做初始化的线程继续往下走
如果已经是fully_initialized了说明有线程已经执行完了clinit方法,因此不会再执行clinit方法了。