类初始化造成的死锁
1.死锁是怎么产生的 类初始化是一个很隐蔽的操作,是由虚拟机主导完成的,开发人员不了解类加载机制的话,可能压根不知道类初始化是个什么东东。类初始化的文章有专门讲过,可参考Java虚拟机类加载机制,里面有详细描述。 关于类初始化有几个关键特性: 类初始化的过程其实就是执行类构造器方法<clinit>()的过程; 在子类初始化完成时,虚拟机会保证其父类有初始化完成; 多线程环境下,虚拟机执行<clinit>()方法会自动加锁; 在java中,死锁肯定是在多线程环境下产生的。多个线程同时需要互相持有的某个资源,自己的资源无法释放,别人的资源又无法得到,造成循环依赖,进而一直阻塞在那里,这样就形成死锁了。 2.产生死锁的情况 2.1 两个类初始化互相依赖 最明显的情况是,2个类在不同的线程中初始化,彼此互相依赖,我们来看个例子: public class Test { public static class A { static { System.out.println("class A init."); B b = new B(); } public static v...