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

23种设计模式-创建型模式之单例模式(Java版本)

Java 单例模式(Singleton Pattern)详解

🌟 什么是单例模式?

单例模式确保一个类只有一个实例,并提供一个全局访问点来访问它。


🧠 使用场景

  • 配置管理类(如读取配置文件)
  • 日志工具类(如 Log4j 的 Logger)
  • 数据库连接池
  • 缓存管理
  • 线程池

✅ 实现方式(Java)

方式一:饿汉式(类加载时就实例化)

public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
  • 优点:简单、线程安全
  • 缺点:类加载时就创建实例,可能浪费资源

方式二:懒汉式(线程不安全)

public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
  • 缺点:多线程环境会创建多个实例

方式三:懒汉式 + synchronized(线程安全)

public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
  • 缺点:加锁影响性能

方式四:双重检查锁(DCL)

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 防止指令重排

方式五:静态内部类

public class Singleton {private Singleton() {}private static class Holder {private static final Singleton instance = new Singleton();}public static Singleton getInstance() {return Holder.instance;}
}
  • 优点:利用 JVM 机制,线程安全 + 懒加载 + 高性能

方式六:枚举实现(最推荐)

public enum Singleton {INSTANCE;public void doSomething() {System.out.println("Doing something...");}
}
  • 优点:防反射、防反序列化、天然线程安全
  • 缺点:不能延迟加载

🔐 防止反射与反序列化破坏单例

防反射

private Singleton() {if (instance != null) {throw new RuntimeException("反射破坏单例!");}
}

防反序列化

private Object readResolve() {return instance;
}

📌 各方式对比

实现方式是否懒加载是否线程安全推荐度
饿汉式★★
懒汉式
synchronized★★
DCL★★★★
静态内部类★★★★★
枚举★★★★★(最安全)

相关文章:

  • 用 Deepseek 写的html油耗计算器
  • AI 模型高效化:推理加速与训练优化的技术原理与理论解析
  • 基于Python的医疗质量管理指标智能提取系统【2025代码版】
  • 从入门到精通【MySQL】 JDBC
  • 05-DevOps-Jenkins自动拉取构建代码2
  • 「数据可视化 D3系列」入门第七章:坐标轴的使用
  • 数据结构——八大排序算法
  • 第十节:性能优化-如何排查组件不必要的重复渲染?
  • PH热榜 | 2025-04-17
  • requestAnimationFrame 深度理解
  • 第二十三天 - 性能优化技巧 - 内存分析与调优 - 练习:资源泄漏检测工具
  • GPT对话UI--通义千问API
  • 【LangChain4j快速入门】5分钟用Java玩转GPT-4o-mini,Spring Boot整合实战!| 附源码
  • 基于labview模拟出租车计价器的设计
  • 解锁动态规划的奥秘:从零到精通的创新思维解析(9)
  • React 设计艺术:如何精确拆分组件接口,实现接口隔离原则
  • 逻辑回归 (Logistic Regression)
  • C++学习:六个月从基础到就业——面向对象编程:重载运算符(下)
  • GPU 招投标全流程分析与总结
  • UE5 相机裁剪面
  • 北京人艺新戏《一日顶流》将出现人工智能角色
  • 新华每日电讯:把纪律的螺丝拧得紧而又紧
  • 俄乌直接谈判勉强收场,特朗普再次“电话外交”能否有用?|907编辑部
  • 小米法务部:犯罪团伙操纵近万账号诋毁小米,该起黑公关案告破
  • 中国田径巡回赛西安站完赛:男子跳远石雨豪夺冠,女子跳高刘肼毅折桂
  • 中国首颗地质行业小卫星“浙地一号”成功发射