java设计模式之单例模式学习


在Java中,单例模式是一种常用的设计模式,它确保了一个类仅有一个实例,并提供一个全局访问点来获取这个实例。以下是单例模式的一种常见实现方式,使用了双重检查锁定(Double-Checked Locking)来优化性能,同时保证了线程安全。


public class Singleton {
    // 使用volatile关键字保证多线程环境下变量的可见性和禁止指令重排序
    private static volatile Singleton instance;

    // 私有化构造方法,防止外部通过new创建实例
    private Singleton() {}

    // 提供全局访问点来获取实例
    public static Singleton getInstance() {
        // 第一次检查实例是否存在,不存在则进入同步块
        if (instance == null) {
            // 同步块,保证多线程环境下只有一个线程能进入
            synchronized (Singleton.class) {
                // 第二次检查实例是否存在,不存在则创建
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    // 其他方法和属性...
}

这段代码展示了如何通过一个私有静态变量`instance`来保存类的唯一实例,并通过一个私有的构造方法来防止外部直接创建实例。`getInstance()`方法提供了全局访问点,使用双重检查锁定机制来确保线程安全并提升性能。

注意,虽然双重检查锁定是线程安全且性能较高的单例模式实现方式,但在Java 9及以后的版本中,由于引入了更高效的内存管理模型,你可能更倾向于使用`java.util.concurrent`包下的工具类(如`java.util.concurrent.atomic.AtomicReference`)来实现单例模式,或者使用更简洁的Java 12中引入的`var`关键字(尽管这并不影响单例模式的实现方式,只是让代码更简洁)。不过,对于大多数场景而言,上述的双重检查锁定实现已经足够使用。