二十三种设计模式-单例模式

单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。

单例模式两种实现方法:懒汉式和饿汉式。

懒汉式(Lazy Initialization)

懒汉式单例模式在第一次被使用时才创建实例,这种方式可以延迟对象的创建,节省资源。

线程不安全实现:

复制代码
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

这种实现方式在多线程环境下可能会出现问题,因为两个线程可能同时检查到instancenull并尝试创建实例,导致创建多个实例。

线程安全实现(双重检查加锁):

复制代码
public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

这里使用了volatile关键字和双重检查锁定机制来确保线程安全。

饿汉式(Eager Initialization)

饿汉式单例模式在类被加载时就创建实例,这种方式保证了实例的唯一性,并且在任何时候都能快速访问实例。

复制代码
public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

饿汉式实现简单,并且是线程安全的,因为实例在类加载时就已经创建好了,不存在多线程访问的问题。

区别

  1. 实例创建时机:懒汉式在第一次使用时创建实例,而饿汉式在类加载时就创建实例。
  2. 资源利用:懒汉式可以延迟对象的创建,节省资源,而饿汉式不管是否使用都会创建实例,可能会造成资源浪费。
  3. 线程安全性:饿汉式天然线程安全,而懒汉式需要额外的处理来保证线程安全。
  4. 性能:懒汉式在第一次访问时需要进行同步操作,可能会有性能损耗;饿汉式则没有这个问题,但需要承担实例始终占用内存的代价。

选择哪种方式取决于具体的需求和场景。如果实例化代价较大,且不是经常使用,懒汉式可能更合适;如果实例化代价不大,或者需要保证绝对的线程安全,饿汉式可能更合适。

相关推荐
Kel3 小时前
Claude Code 架构深度剖析:从终端输入到大模型响应的完整过程
人工智能·设计模式·架构
￰meteor7 小时前
23种设计模式 -【观察者】
设计模式
妙蛙种子3119 小时前
【Java设计模式 | 创建者模式】 抽象工厂模式
java·开发语言·后端·设计模式·抽象工厂模式
怨言.10 小时前
设计模式之模板方法模式
设计模式·模板方法模式
无籽西瓜a10 小时前
【西瓜带你学设计模式 | 第十四期 - 享元模式】享元模式 —— 内外状态分离与对象共享实现、优缺点与适用场景
java·设计模式·软件工程·享元模式
七夜zippoe11 小时前
设计模式在Spring等框架中的应用:模板方法、工厂、适配器等
java·spring·设计模式·模板·适配器·工厂
panzer_maus11 小时前
工厂模式、代理模式与单例模式的介绍
java·设计模式·代理模式
糟糕好吃1 天前
AI 全流程解析(LLM / Token / Context / RAG / Prompt / Tool / Skill / Agent)
前端·后端·设计模式
kvo7f2JTy1 天前
JAVA 设计模式
java·开发语言·设计模式
程序员小寒1 天前
JavaScript设计模式(九):工厂模式实现与应用
开发语言·前端·javascript·设计模式