饿汉式单例与懒汉式单例模式

饿汉式和懒汉式是单例模式(Singleton Pattern)的两种常见实现方式。单例模式确保一个类只有一个实例,并提供该实例的全局访问点。这两种方式主要在实例创建的时机上有所不同。以下是对这两种方式的详细解释:

饿汉式单例

特点:

  • 立即加载:在类加载时就创建单例实例。
  • 线程安全:由于实例在类加载时即被创建,因此不存在多线程环境下实例重复创建的问题。
  • 资源消耗:即使单例实例可能很久之后才会被使用,甚至有可能不被使用,也会提前占用资源。

实现方式:

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

    private Singleton() {
        // 构造函数私有化,防止外部实例化
    }

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

懒汉式单例

特点:

  • 延迟加载:只有在首次需要使用时才创建实例。
  • 非线程安全(无同步处理时):在多线程环境下,如果不进行同步控制,可能会导致多个实例被创建。
  • 资源节约:实例只有在需要时才创建,因此不会占用不必要的资源。

实现方式(基本形式,非线程安全):

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

    private Singleton() {
        // 构造函数私有化,防止外部实例化
    }

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

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

java 复制代码
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;
    }
}

比较

  • 实现难度:饿汉式实现简单,懒汉式需要考虑线程安全问题。
  • 性能:饿汉式不需要加锁,性能较高。懒汉式在某些实现中需要同步,可能影响性能。
  • 资源:饿汉式会提前占用资源,适用于实例创建成本不高的场景。懒汉式则只在需要时创建实例,适合实例创建成本较高且使用频率较低的场合。

选择哪种方式取决于具体应用场景的需求,资源使用、性能需求、以及线程安全性等因素。

相关推荐
维吉斯蔡5 小时前
【VS Code / Cursor】文件夹右键快捷打开与文件类型自动关联
开发语言·程序人生·学习方法
蓝斯4975 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加贝塞尔曲线,上、下、左、右连接点
java·c#·流程图
前端工作日常5 小时前
我学习到的Java 的 Service 分层:itf 和 impl 到底是什么?
java·后端
都叫我大帅哥6 小时前
Spring @Transactional 注解完全指南
java·spring
Java成神之路-6 小时前
G1 垃圾回收器 :SATB + TAMS核心机制深度解析
java·jvm
前端工作日常6 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端
带刺的坐椅6 小时前
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎
java·solon·jetty·undertow·mcp-server·htttp
luj_17687 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
always_TT7 小时前
【Python 日志记录:logging 模块入门】
开发语言·python·php
xcLeigh7 小时前
Go入门:变量声明的五种方式详解
java·开发语言·golang