设计模式-创建型模式

2021-07-02  本文已影响0人  MIRROR1217

创建型模式分为五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式;

一些问题

1.单例模式中DCL是线程安全的吗?为什么?怎么改进?

单例模式中DCL不一定线程安全,看如下代码:

public class Singleton {
    private static Singleton singleton;

    private Singleton(){}
    
    public static Singleton getInstance(){
        if (singleton == null){ // -----> ①
            synchronized(Singleton.class){
                if(singleton == null){
                    singleton = new Singleton();// ---> ②
                }
            }
        }
        return singleton;
    }
}

singleton = new Singleton()这个过程分为三部分:
memory=Singleton();//1:分配对象内存空间
singleton(memory);//2:初始化对象
singleton=memory;//3:设置singleton指向刚分配的内存地址,此时singleton!=null;
由于JVM为了优化指令,提高程序运行效率,可以对代码进行指令重排序。那么上述过程可能变成这样:
memory=Singleton();//1:分配对象内存空间
singleton=memory;//3:设置singleton指向刚分配的内存地址,此时singleton!=null;
singleton(memory);//2:初始化对象
这样有可能会造成问题,所以要添加volatile禁止指令重排序,代码如下:

public class Singleton {
    //通过volatile关键字来确保安全
    private volatile static Singleton singleton;

    private Singleton(){}

    public static Singleton getInstance(){
        if(singleton == null){
            synchronized (Singleton.class){
                if(singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}
2.浅拷贝和深拷贝
上一篇 下一篇

猜你喜欢

热点阅读