设计模式三:单例模式

单例模式

确保一个类只有一个实例,并提供一个全局访问点。单例很简单,最多就是需要考虑下多线程问题。

简单实现

public class Singleton {
    // static 记录唯一实例
    private static Singleton uniqueInstance;

    // 私有化构造方法,不让其他对象new创建单件实例
    private Singleton(){}

    // 提供获取uniqueInstance的入口
    public static Singleton getUniqueInstance(){
        if (uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

使用时参建,又叫懒汉式,但不是线程安全的,后面细说。还有一种写法是饿汉式 ,实例被声明成 static 和 final 变量了,在第一次加载类到内存中时就会初始化。

public class Singleton{
    //类加载时就初始化
    private static final Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return instance;
    }
}

饿汉式 的缺点是无法根据具体动态参数初始化单例,它在jvm加载类时马上创建了唯一实例。

双重检查加锁

public class Singleton {
    // volatile 确保多线程正确处理uniqueInstance变量
    private volatile static Singleton uniqueInstance;

    // 私有化构造方法,不让其他对象new创建单件实例
    private Singleton(){}

    // 提供获取uniqueInstance的入口
    public static Singleton getUniqueInstance(){
        // 避免大量线程等待进入判断uniqueInstance是否已经创建
        if (uniqueInstance == null){
            // synchronized 保证线程安全
            synchronized (Singleton.class){
                if (uniqueInstance == null){
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}
CONTENTS