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

单例模式(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. 性能:懒汉式在第一次访问时需要进行同步操作,可能会有性能损耗;饿汉式则没有这个问题,但需要承担实例始终占用内存的代价。

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

相关推荐
小股虫2 小时前
数据库外科手术:一份拖垮系统的报表,如何倒逼架构演进
数据库·微服务·设计模式·架构·方法论
Geoking.6 小时前
【设计模式】原型模式(Prototype Pattern)详解
设计模式·原型模式
数据与后端架构提升之路7 小时前
系统架构设计师(软考高级)设计模式备考指南
设计模式·系统架构
小小小怪兽7 小时前
聊聊上下文工程👷
设计模式·llm
会编程的李较瘦7 小时前
【期末考试总结】spark课程知识点
大数据·单例模式·spark
蔺太微1 天前
桥接模式(Bridge Pattern)
设计模式·桥接模式
zhaokuner1 天前
14-有界上下文-DDD领域驱动设计
java·开发语言·设计模式·架构
Geoking.1 天前
【设计模式】抽象工厂模式(Abstract Factory)详解:一次创建“一整套产品”
设计模式·抽象工厂模式
zhaokuner1 天前
12-深层模型与重构-DDD领域驱动设计
java·开发语言·设计模式·架构
不加糖4351 天前
设计模式 -- 适配器 & 策略模式
python·设计模式