Java 饿汉式 单例模式

Java 饿汉式 单例模式

饿汉式(Eager Initialization)是 Java 单例模式中最简单、最基础的一种实现方式。它的核心思想非常形象:就像一个"饿汉"一样,迫不及待地在类加载时就提前把唯一的实例对象创建好,不管后续有没有用到,都先把"粮食"囤好。

以下是饿汉式单例模式的代码实现、核心原理以及优缺点分析:

📝 代码实现

java 复制代码
public class HungrySingleton {
    // 1. 在类加载时,直接创建唯一的静态实例(饿汉式核心)
    private static final HungrySingleton INSTANCE = new HungrySingleton();

    // 2. 私有化构造方法,禁止外部通过 new 关键字创建对象
    private HungrySingleton() {}

    // 3. 提供全局公共的静态方法,供外部获取唯一的实例
    public static HungrySingleton getInstance() {
        return INSTANCE;
    }
}

💡 核心原理

饿汉式单例模式之所以能实现线程安全,主要依赖于 JVM 的类加载机制

在 Java 中,类的加载过程是线程安全的(由 JVM 保证一个类只会被加载一次)。饿汉式将实例的创建放在了静态变量初始化阶段,这意味着当类被加载时,实例就已经被创建好了。因此,它天然地避免了多线程并发创建多个实例的问题,不需要额外加锁。

✅ 优点

  • 实现简单:代码非常简洁明了,易于理解和维护。
  • 绝对线程安全:利用 JVM 类加载机制保证实例的唯一性,没有任何并发风险。
  • 获取效率高 :因为实例在类加载时就已经创建完毕,后续调用 getInstance() 方法时直接返回即可,没有同步锁的开销,性能极高。

❌ 缺点

  • 可能造成内存浪费:由于实例在类加载时就被创建,如果这个单例类在整个程序运行期间从未被使用过,那么这个提前创建好的实例就会一直占用内存,造成资源闲置。
  • 延长启动时间:如果单例对象的初始化过程非常耗时(例如需要加载大量配置文件或建立复杂的数据库连接),会导致应用程序的启动速度变慢。

🎯 适用场景

饿汉式非常适合实例创建开销较小、且程序运行期间一定会被使用的场景,例如:

  • 简单的全局配置管理器
  • 轻量级的日志工具类
  • 一定会用到的常量池或缓存管理器

如果你需要实现"用到时才创建"(即延迟加载/懒加载)的单例模式,可以考虑使用双重检查锁(DCL)静态内部类的方式。


要不要看看饿汉式和懒加载(双重检查锁)在代码和性能上的具体对比?

相关推荐
雪之下雪乃的代码日记11 分钟前
Python快速入门(Java开发者版)
java·开发语言·笔记·python
敲个大西瓜31 分钟前
Springboot核心面试题
java·spring boot·后端
器灵科技32 分钟前
Seedance2.5 VS MiniMax H3 同日上线:AI短剧创作者该怎么选?
java·人工智能·阿里云·prompt·aigc
Y38153266238 分钟前
SERP API 请求体 Gzip 压缩优化实战:大数据量降带宽 80%
开发语言·前端·php
weixin1997010801639 分钟前
☁️《抖店API基础¥0.018/百次·增值¥0.05/百次:云内云外价差架构实战》(附Python源码)
开发语言·python·架构
xbgRS1 小时前
Mybatis源码-核心流程及核心类
java·mybatis
zzh___zzh1 小时前
Java Stream API 常用方法笔记
java·笔记
萌动的小火苗1 小时前
1、python基础面试题
java·开发语言·python
运维行者_2 小时前
网络监控与ITSM集成:从告警到工单,实现运维自动化闭环
开发语言·网络·分布式·后端·架构·flask·php
麻雀聊技术2 小时前
一重启 AI 就失忆?用 Spring AI + PostgreSQL 3步搞定“长期记忆”持久化(附完整代码)
java·spring·openai