类加载机制导致静态变量出错问题

先看代码:

 1 public class Test {
 2     public static void main(String[] args) {
 3         Singleton singleton = Singleton.getInstance();
 4         System.out.println("i1:" + Singleton.i1);
 5         System.out.println("i2:" + Singleton.i2);
 6     }
 7 }
 8 
 9 class Singleton {
10 
11     public static int i1;
12 
13     private static Singleton singleton = new Singleton();
14 
15     private Singleton() {
16         i1++;
17         i2++;
18     }
19 
20     public static int i2 = 0;
21 
22     public static Singleton getInstance() {
23         return singleton;
24     }
25 
26 }

运行结果是

i1:1
i2:0

Process finished with exit code 0


代码分析:

整个执行过程,分为加载、链接、初始化,主要分析链接和初始化阶段代码的逻辑

1.链接阶段:会为类的静态变量分配内存,并且将其初始化为 默认值,在这里,Singleton类的执行流程是

a.为i1分配内存,并且初始化为默认值0

b.为singleton分配内存,并且初始化为null

c.为i2分配每次,并且初始化为默认值0

2.初始化阶段,由于执行了Singleton.getInstance()方法,是对Singleton类的主动调用,会进行Singleton类的初始化(初始化会做的事情:为类的静态成员变量赋予正确的初始值)的过程为:

a.i1置为初始值,这里i1没有主动赋值,跳过

b.singleton置为初始值,这里是new一个对象,并且,这时候对象的i1为主动赋值之后的值(0),i2是分配的默认值(0),进行自增操作以后,i1=1 i2=1

c.i2置为初始值,这里是0,所以,到这里 i1=1 i2=0

原文地址:https://www.cnblogs.com/billmiao/p/9872214.html