类初始化死锁

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方法了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容