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

单例模式(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 小时前
Effective Modern C++ 条款40:深入理解 Atomic 与 Volatile 的多线程语义
开发语言·c++·学习·算法·设计模式·架构
九狼4 小时前
Riverpod 2.0 代码生成与依赖注入
flutter·设计模式·github
一点多余.5 小时前
java中的单例模式
java·开发语言·单例模式
geovindu6 小时前
python: Visitor Pattern
python·设计模式·访问者模式
五阿哥永琪6 小时前
常见设计模式简介
设计模式
资深web全栈开发15 小时前
CQS - 命令查询分离:驯服副作用
设计模式
geovindu1 天前
python: Template Method Pattern
开发语言·python·设计模式·模板方法模式
NaCl鱼呜啦啦1 天前
static 实例 vs 单例模式
开发语言·单例模式
HY小海1 天前
【Unity游戏创作】常见的设计模式
unity·设计模式·c#·游戏程序
Yongqiang Cheng1 天前
设计模式:C++ 模板方法模式 (Template Method in C++)
设计模式·template method·c++ 模板方法模式