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

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.xdnf.cn/news/10176.html

相关文章:

  • Redis最佳实践——安全与稳定性保障之数据持久化详解
  • 2025-5-31-C++ 学习 字符串(终)
  • Springcloud Alibaba自定义负载均衡详解
  • 某航参数逆向及设备指纹分析
  • 告别硬编码!用工厂模式优雅构建可扩展的 Spring Boot 应用 [特殊字符]
  • STM32CubeMX定时器配置
  • 如何在 Ubuntu22.04 上安装并开始使用 RabbitMQ
  • QuickJS 在生物化学计算中的应用
  • MATLAB实战:实现数字调制解调仿真
  • 建造者模式:优雅构建复杂对象
  • Ubuntu下编译mininim游戏全攻略
  • 力扣HOT100之动态规划:139. 单词拆分
  • Spring之循环依赖源码解析
  • 现代数据湖架构全景解析:存储、表格式、计算引擎与元数据服务的协同生态
  • MySQL数据库复合查询
  • JVM 核心组件深度解析:堆、方法区、执行引擎与本地方法接口
  • 德拜温度热容推导
  • python:PyMOL 使用教程 及实用示例
  • 医疗多模态共情推理与学习一体化网络构成初探
  • Redisson学习专栏(四):实战应用(分布式会话管理,延迟队列)
  • 基于Python学习《Head First设计模式》 第一章 策略模式
  • 机器学习03-色彩空间:RGB、HSV、HLS
  • 2024 CKA模拟系统制作 | Step-By-Step | 20、题目搭建-节点维护
  • IEEE P370:用于高达 50 GHz 互连的夹具设计和数据质量公制标准
  • 芯片:数字时代的算力引擎——鲲鹏、升腾、海光、Intel 全景解析
  • 【递归、搜索与回溯算法】综合练习(二)
  • 跳动的爱心
  • USB MSC
  • 【大模型面试每日一题】Day 32:位置编码的改进方向与Rotary Position Embedding的核心优势
  • Augment vs Cursor:当Cursor解决不了问题时的最佳补充方案