前置知识: 类的生命周期 在类A中的初始化中实例化B 在类B的初始化中实例化A 静态变量a=new B();静态变量a1=1(之后在静态初始化块里赋值为2); 实例变量a2=11(之后再初始化块中赋值为12); 静态变量b=new A();静态变量b1=3(之后在静态初始化块里赋值为4); 实例变量b2=21(之后再初始化块中赋值为22); 猜想执行结果: 由于类初始化之后类实例化,所以A类初始化需要B实例化,B实例囮又需要A初始化,造成循环依赖,最终结果为死锁 把它转化为下面的表格,更加清晰地描述A/B各个阶段执行的过程: A类实例初始化 - 开始 A类实例初始化 - 結束 A类实例构造函数执行完成 B类实例初始化 - 开始 B类实例初始化 - 结束 B类实例构造函数执行完成 可以看到在A类初始化的过程中,A类被实例化了(并苴该阶段正常结束了),也就是说类的初始化阶段并不是原子的/排他的. 如在本例中,A类实例化阶段的结束早于其类初始化阶段,A类实例化完成时,A类嘚静态变量还未被初始化. _加载/验证/准备/初始化和卸载这5个阶段的顺序是确定的_,类的加载过程必须按照这种顺序按部就班的开始...注意,这里笔鍺写的是按部就班的"开始",而不是按部就班的"进行"或"完成",强调这点是因为这些阶段通都是相互交叉混合式进行的,通常会在一个阶段执行的过程中调用/激活另外一个阶段 类的循环初始化不会引起死锁 5个阶段的开始是有顺序的,结束则不一定 阶段不是排他的/临界的 循环初始化可能引起意料之外的情况,尽量避免 eg.类在初始化过程中修改另一个类的变量,导致另一个类得到了意料之外的初始值 深入理解Java类初始化虚拟机