volatile 使用(单例)

保证可见性和有序性,不能保证原子性(long类型有64位,A线程读了前32位,B线程读了后32位)

 

 1 public class SingletonDemo {
 2 
 3     private static volatile SingletonDemo instance = null;//注意需要volatile
 4   
 5     private SingletonDemo() {   }
 6   
 7     public static SingletonDemo getInstance() {
 8         if (instance == null) { //二次检查,比直接用独占锁效率高
 9                synchronized (SingletonDemo .class){
10                     if (instance == null) {
                    //实例化过程分为3步,1、分配内存 2、初始化对象 3、设置的变量(instance)指向刚分配的内存地址,此时instance才!=null
                    //其中2、3因为指令重排序的情况,可以调换位置,就造成了,读取到instance的时候,引用对象还没有初始化完成。
                    //所以需要给instance 加个volatile,防止指令重排序
11 instance = new SingletonDemo (); 12 } 13 } 14 } 15 return instance; 16 } 17 }

 

posted @ 2021-04-30 09:22  龙之谷2019  阅读(92)  评论(0)    收藏  举报