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

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

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

相关推荐
HEU_firejef5 小时前
设计模式——工厂模式
java·开发语言·设计模式
DBWYX5 小时前
GoF23种设计模式 简介
设计模式·面向对象
诸葛悠闲9 小时前
设计模式——外观模式
设计模式·外观模式
玉面小君13 小时前
C# 设计模式(结构型模式):代理模式
设计模式·c#·代理模式
MinBadGuy14 小时前
【GeekBand】C++设计模式笔记20_Composite_组合模式
c++·设计模式
渊渟岳14 小时前
掌握设计模式--组合模式
设计模式
玉面小君14 小时前
C# 设计模式(创建型模式):建造者模式
设计模式·c#·建造者模式
玉面小君14 小时前
C# 设计模式(结构型模式):外观模式
设计模式·c#·外观模式
lshzdq16 小时前
【设计模式】依赖注入(Dependency Injection, DI)
c++·设计模式·c#
玉面小君17 小时前
C# 设计模式的六大原则(SOLID)
设计模式·c#