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) {
// 單線程有可重入性激涤,所以不會死鎖
// 多線程在執(zhí)行<clinit> 時血淌,會死鎖。
new Thread(() -> A.testA()).start();
new Thread(() -> B.testB()).start();
}
}
當有個線程正在執(zhí)行這個類的clinit方法的時候猾蒂,就會設置這個類的狀態(tài)為being_initialized,
當正常執(zhí)行完之后就馬上設置為fully_initialized,然后才喚醒其他也在等著對其做初始化的線程繼續(xù)往下走
如果已經(jīng)是fully_initialized了說明有線程已經(jīng)執(zhí)行完了clinit方法是晨,因此不會再執(zhí)行clinit方法了肚菠。