单例模式双重检测锁
instance = new DoubleCheckLock();可以分为以下3步完成(伪代码)
memory = allocate();//1.分配对象内存空间<br>instance(memory);//2.初始化对象<br>instance = memory;//3.设置instance指向刚分配的内存地址,此时instance!=null
由于步骤1和步骤2间可能会重排序,如下:
memory=allocate();//1.分配对象内存空间<br>instance=memory;//3.设置instance指向刚分配的内存地址,此时instance!=null,但是对象还没有初始化完成!<br>instance(memory);//2.初始化对象
线程安全问题
volatile,private volatile static DoubleCheckLock instance;