类初始化死锁

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) {

        // 单线程有可重入性,所以不会死锁
        // 多线程在执行 时,会死锁。
        new Thread(() -> A.testA()).start();

        new Thread(() -> B.testB()).start();
    }

}

当有个线程正在执行这个类的clinit方法的时候,就会设置这个类的状态为being_initialized,
当正常执行完之后就马上设置为fully_initialized,然后才唤醒其他也在等着对其做初始化的线程继续往下走
如果已经是fully_initialized了说明有线程已经执行完了clinit方法,因此不会再执行clinit方法了。

你可能感兴趣的:(类初始化死锁)