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 }

浙公网安备 33010602011771号