设计模式——单例模式(Singleton)

单例模式(Singleton Pattern)是设计模式中的一种,它确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。这种模式在多种场景下都非常有用,比如配置文件的读取、数据库连接的创建、线程池的管理等。

实现单例模式的要点:

  1. 私有构造函数 :防止其他类通过new关键字创建实例。
  2. 私有静态实例:在类内部定义一个静态的实例变量来保存类的唯一实例。
  3. 公共的静态方法:提供一个公共的静态方法来获取该类的唯一实例。

示例代码(Java):

java 复制代码
public class Singleton {
    // 私有静态实例
    private static Singleton instance;

    // 私有构造函数
    private Singleton() {}

    // 公共的静态方法(也称为获取器或访问器)
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

注意 :上述示例中的getInstance方法使用了synchronized关键字,这是为了保证在多线程环境下的线程安全。但是,这种实现方式在性能上可能不是最优的,因为每次调用getInstance方法时都需要进行同步。

改进的单例模式(双重检查锁定/双检锁):

java 复制代码
public class Singleton {
    // 使用 volatile 关键字来确保 instance 在多线程中的可见性
    private volatile static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) { // 第一次检查
            synchronized (Singleton.class) {
                if (instance == null) { // 第二次检查
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

在改进的版本中,我们使用了双重检查锁定(Double-Checked Locking, DCL)来减少同步的开销。同时,我们使用了volatile关键字来确保instance变量在多线程环境下的可见性。这是因为instance = new Singleton();这行代码并不是一个原子操作,它包含了三个步骤:分配内存、初始化对象、将instance指向分配的内存地址。如果没有volatile关键字,编译器可能会进行指令重排序,导致其他线程看到instance不为null,但是对象还没有被完全初始化的情况。

其他实现方式:

除了上述两种常见的实现方式外,还有使用枚举(Enum)、静态内部类等方式来实现单例模式。这些方式在某些场景下可能更加简洁、高效。

相关推荐
Overt0p24 分钟前
抽奖系统(6)
java·spring boot·redis·设计模式·rabbitmq·状态模式
__万波__44 分钟前
二十三种设计模式(二十三)--责任链模式
java·设计模式·责任链模式
帅次2 小时前
系统设计方法论全解:原则、模型与用户体验核心要义
设计模式·流程图·软件工程·软件构建·需求分析·设计规范·规格说明书
蔺太微2 小时前
装饰器模式(Decorator Pattern)
设计模式·装饰器模式
reddingtons10 小时前
【游戏宣发】PS “生成式扩展”流,30秒无损适配全渠道KV
游戏·设计模式·新媒体运营·prompt·aigc·教育电商·游戏美术
sxlishaobin12 小时前
设计模式之桥接模式
java·设计模式·桥接模式
晴殇i16 小时前
package.json 中的 dependencies 与 devDependencies:深度解析
前端·设计模式·前端框架
HL_风神20 小时前
设计原则之单一职责原则
c++·学习·设计模式·单一职责原则
这里是彪彪21 小时前
Java多线程中的单例模式
java·开发语言·单例模式
linzihahaha21 小时前
C++ 单例模式总结
开发语言·c++·单例模式