多线程实例

双重检查锁定来实现延迟初始化的方案:

class Instance {

    
}
/*
 *     instance=new Singleton()
    memory = allocate();  // 1:分配对象的内存空间
    ctorInstance(memory);  // 2:初始化对象
    instance = memory;   // 3:设置instance指向刚分配的内存地址
 */
public class SafeDoubleCheckedLocking {
    private volatile static Instance instance;//2,3之间不会重排序
    public static Instance getInstance() {
    if (instance == null) {
        synchronized (SafeDoubleCheckedLocking.class) {
        if (instance == null)
            instance = new Instance(); // instance为volatile,现在没问题了
        }
    }
    return instance;
    }
}

基于类初始化的解决方案:(

JVM在类的初始化阶段(即在Class被加载后,且被线程使用之前),会执行类的初始化。在
执行类的初始化期间,JVM会去获取一个锁。这个锁可以同步多个线程对同一个类的初始化。

)

class Instance{
    
}
public class InstanceFactory {
    private static class InstanceHolder {
        public static Instance instance = new Instance();
    }
    public static Instance getInstance() {
        return InstanceHolder.instance;  // 这里将导致InstanceHolder类被初始化
    }
}

 

posted on 2016-08-02 10:35  james-roger  阅读(121)  评论(0编辑  收藏  举报