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