在java内存模型中,volatile 关键字作⽤可以是保证可见性或者禁⽌指令重排。这⾥是因为 singleton = new Singleton() ,它并⾮是⼀个原⼦
操作,事实上,在 JVM 中上述语句⾄少做了以下这 3 件事:
第⼀步是给 singleton 分配内存空间;
第⼆步开始调⽤ Singleton 的构造函数等,来初始化 singleton;
第三步,将 singleton 对象指向分配的内存空间(执⾏完这步 singleton 就不是 null 了)。
这⾥需要留意⼀下 1-2-3 的顺序,因为存在指令重排序的优化,也就是说第 2 步和第 3 步的顺序是不能保证的,最终的执⾏顺序,可能是 1-
2-3,也有可能是 1-3-2。