双重检查锁定与延迟初始化

来源:互联网 发布:幼儿美工室活动记录 编辑:程序博客网 时间:2024/05/19 05:02

延迟初始化的作用:

降低初始化类和创建对象的开销,按需分配创建。

常用方法:

懒汉模式--采用双重检查锁定(Doubled-Checked Locking)。避免使用锁机制,能够降低并发开销。

public class DoubleCheckedLocking{    private static iInstance instance;    public static Instance getInstance(){        if(instance==null)//这里instance读取到不为null,但instance引用的对象可能还没有初始化完成            synchronized(DoubleCheckedLocking.Class){                if(instance==null)                    instance=new Instance();//问题根源(*)            }        return instance;    }}

(*)的代码可以分为三行代码:

1、memory=allocate():分配内存;

2、ctorInstance(memory):初始化对象;

3、instance=memory:设置instance指向刚分配的地址。

上面2、3步骤在OS中将被重排序以优化程序执行性能,在单线程情况下,这种排序并没有改变执行结果。

问题:

但是在并发条件下,另一线程B判断instance!=null,但此时这个对象还没有被A线程初始化。

解决方案:

把instance声明为volatile型