【单例模式】单例模式

单例模式

饿汉式(急切实例化)

public class EagerSingleton {

    /** 1.私有化构造方法 */
    private EagerSingleton() {
    }
    
    /** 2.声明静态成员变量并赋初始值-类初始化的时候静态变量就被加载,因此叫做饿汉式 */
    public static EagerSingleton eagerSingleton=new EagerSingleton();

    /** 3.对外暴露公共的实例化方法 */
    public static EagerSingleton getInstance(){
        return eagerSingleton;
    }
    
}

懒汉式(延迟实例化)(DCL双重检测)

  -为什么要判断两次?  

    避免由于并发导致的线程安全问题

  -为什么要使用 volatile关键字修饰 ourInstance?

    避免指令重排序,同时保证变量ourInstance在线程之间是可见的

public class LazySingleton {

    /** 1.私有化构造方法 */
    private LazySingleton() {
    }

    /** 2.声明静态变量 -这里声明为volatile,是禁止指令重排序 */
    private volatile static LazySingleton ourInstance;

    /** 3.对外暴露公共的实例化方法 */
    public static LazySingleton getInstance() {

        if (ourInstance == null) {
            synchronized (LazySingleton.class) {
                if (ourInstance == null) {
                    ourInstance = new LazySingleton();
                }
            }
        }
        return ourInstance;
    }

}
原文地址:https://www.cnblogs.com/july-sunny/p/11675012.html