当前位置: 首页 > news >正文

实用指南:Java 单例模式详解

目录

1. 饿汉式(Eager Initialization)

2. 懒汉式(Lazy Initialization)

3. 懒汉式 + 同步锁(线程安全)

4. 双重检查锁(Double-Checked Locking)

5. 静态内部类(推荐)

6. 枚举(最佳实践)

单例模式的序列化与反序列化问题

单例模式适用场景

总结


单例模式是 Java 中最简单且最常用的设计模式之一,其核心思想是确保一个类只有一个实例,并提供全局访问点。下面分别详解 Java 中的单例模式:

1. 饿汉式(Eager Initialization)

特点:类加载时立即创建实例,线程安全。
缺点:不支持延迟加载,可能造成资源浪费。

public class Singleton {
private static final Singleton INSTANCE = new Singleton();private Singleton() {} // 私有构造函数public static Singleton getInstance() {
return INSTANCE;
}
}

2. 懒汉式(Lazy Initialization)

特点:首次调用时创建实例,支持延迟加载。
缺点:多线程环境下不安全。

public class Singleton {
private static Singleton INSTANCE;private Singleton() {}public static Singleton getInstance() {
if (INSTANCE == null) { // 多线程可能同时进入此判断
INSTANCE = new Singleton();
}
return INSTANCE;
}
}

3. 懒汉式 + 同步锁(线程安全)

特点:通过synchronized保证线程安全。
缺点:每次调用都加锁,性能开销大。

public class Singleton {
private static Singleton INSTANCE;private Singleton() {}public static synchronized Singleton getInstance() { // 方法级同步
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}

4. 双重检查锁(Double-Checked Locking)

特点:线程安全且性能优化,仅首次创建时加锁。
关键点:使用volatile关键字禁止指令重排序。

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. 静态内部类(推荐)

特点:线程安全、支持延迟加载,实现简洁。
原理:JVM 保证静态内部类的初始化线程安全。

public class Singleton {
private Singleton() {}private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}

6. 枚举(最佳实践)

特点:线程安全、自动支持序列化机制、防止反射攻击。
推荐场景:需要绝对防止单例被破坏的场景。

public enum Singleton {
INSTANCE;// 可以添加方法
public void doSomething() {
System.out.println("Singleton method called");
}
}

单例模式的序列化与反序列化问题

如果单例类实现了Serializable接口,需添加readResolve()方法防止反序列化时创建新实例:

private Object readResolve() {
return INSTANCE;
}

单例模式适用场景

  • 资源管理器(如数据库连接池、线程池)。
  • 配置文件管理。
  • 日志记录器。
  • GUI 中的窗口管理器。

总结

推荐使用静态内部类枚举实现单例模式:

避免使用普通懒汉式,在多线程环境下需使用双重检查锁或更优方案

http://www.jsqmd.com/news/9569/

相关文章:

  • oppoR9m刷Linux系统: 安装MTK USB VCOM驱动
  • 数据结构与算法学习笔记(Acwing 提高课)----动态规划树形DP - 详解
  • 可视化大屏工具对比:GoView、DataRoom、积木JimuBI、Metabase、DataEase、Apache Superset 与 Grafana - 实践
  • [特殊字符] FFmpeg 学习笔记 - 详解
  • .NET周刊【9月第3期 2025-09-21】
  • 通过实验直观理解神经网络:ReLU网络与几何解释
  • CCPC2023哈尔滨 游记(VP)
  • 2025教练技术行业深度剖析:目标人群、费用与品牌选择
  • 统计备注
  • 单例模式的类和静态方法的类的区别和使用场景 - 指南
  • LGP9871 [NOIP 2023] 天天爱打卡 学习笔记
  • 【OpenGL ES】Windows上OpenGL环境搭建
  • 虚拟现实教育终端科技方案——基于EFISH-SCB-RK3588的全场景国产化替代
  • 免费开源Umi-OCR,离线采用,批量精准!
  • 2025连接器厂家权威推荐榜:防水/m12防水/m8/防水3芯/防水t型三通/防水线束线缆/防水包胶连接器实力制造与创新技术深度解析
  • STM32外部中断(EXTI)以及旋转编码器的简介 - 指南
  • 神经网络中的梯度消失与梯度爆炸 - 实践
  • [数学 - 正态分布]
  • Withdraw x Failure《一元微积分》讲义习题
  • 状态压缩 DP
  • QGIS开发笔记(四):QgsRasterLayer加载Cesium二维地图的瓦片地图数据到QGIS
  • 基于 Chrome 浏览器扩展的Chroma简易图形化界面 - 实践
  • 详细介绍:go语言学习 第4章:流程控制
  • 学号20232328 2025-2026-1 《网络与系统攻防技术》实验一实验报告
  • 《一元微积分》讲义习题
  • 【光照】Unity[光照探针]的作用与工作原理
  • [数学 - 线性回归]
  • 251007
  • Java 并发锁
  • 实用指南:点评中是如何实现短信登录的