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

Java创建型模式---单例模式

单例模式基础概念

单例模式是一种创建型设计模式,其核心思想是确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。在 Java 中实现单例模式主要有以下关键点:

  1. 私有构造函数 - 防止外部通过new关键字创建实例
  2. 静态实例变量 - 类内部持有唯一实例的引用
  3. 静态访问方法 - 提供全局访问该实例的入口

单例模式的几种实现方式

1. 饿汉式(线程安全)

饿汉式是最简单的实现方式,在类加载时就创建实例:

public class EagerSingleton {// 类加载时就初始化实例private static final EagerSingleton instance = new EagerSingleton();// 私有构造函数private EagerSingleton() {}// 静态访问方法public static EagerSingleton getInstance() {return instance;}
}

优点:实现简单,线程安全
缺点:类加载时就创建实例,可能造成资源浪费

2. 懒汉式(非线程安全)

懒汉式在首次调用时才创建实例,但存在线程安全问题:

public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}// 非线程安全的获取实例方法public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}

优点:延迟加载,避免资源浪费
缺点:多线程环境下可能创建多个实例

3. 懒汉式(线程安全,同步方法)

为了解决线程安全问题,可以对获取实例的方法进行同步:

public class LazySingletonSynchronized {private static LazySingletonSynchronized instance;private LazySingletonSynchronized() {}// 同步方法,保证线程安全public static synchronized LazySingletonSynchronized getInstance() {if (instance == null) {instance = new LazySingletonSynchronized();}return instance;}
}

优点:线程安全,延迟加载
缺点:同步方法开销大,影响性能

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

结合懒加载和性能优化的双重检查锁定实现:

public class DoubleCheckedLockingSingleton {// 使用volatile关键字保证可见性和禁止指令重排序private static volatile DoubleCheckedLockingSingleton instance;private DoubleCheckedLockingSingleton() {}public static DoubleCheckedLockingSingleton getInstance() {// 第一次检查,避免不必要的同步if (instance == null) {synchronized (DoubleCheckedLockingSingleton.class) {// 第二次检查,确保在同步块内没有其他线程创建实例if (instance == null) {instance = new DoubleCheckedLockingSingleton();}}}return instance;}
}

优点:线程安全,延迟加载,性能优化
缺点:实现复杂,需要理解 volatile 关键字的作用

5. 静态内部类(推荐)

利用 Java 静态内部类的特性实现高效、线程安全的单例:

public class StaticInnerClassSingleton {private StaticInnerClassSingleton() {}// 静态内部类,持有外部类的实例private static class SingletonHolder {private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();}public static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;}
}

优点:线程安全,延迟加载,实现简单
缺点:无法传递参数

6. 枚举(最佳实践)

使用枚举实现单例是最简洁、最安全的方式:

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

优点

  • 线程安全
  • 防止反序列化重新创建新的对象
  • 防止反射攻击
  • 实现简单

缺点:无法实现延迟加载

单例模式的应用场景

单例模式在以下场景中经常使用:

  1. 资源管理器 - 如数据库连接池、文件系统
  2. 配置信息类 - 全局配置信息的读取和管理
  3. 日志记录器 - 统一的日志输出管理
  4. GUI 组件 - 如窗口管理器、对话框等

注意事项

  1. 序列化问题:如果单例类实现了 Serializable 接口,需要添加 readResolve () 方法防止反序列化创建新实例
  2. 反射攻击:私有构造函数可以被反射破坏,枚举实现可以避免此问题
  3. 多线程环境:必须考虑线程安全问题,推荐使用静态内部类或枚举实现

单例模式虽然简单,但在实际应用中需要根据具体场景选择合适的实现方式,同时注意处理好各种边界情况,确保单例的唯一性和安全性。

http://www.dtcms.com/a/267097.html

相关文章:

  • WSL命令
  • C#每日学习日记
  • 3dmax烘焙插件3dmax法线贴图烘焙教程glb和gltf元宇宙灯光效果图烘焙烘焙光影贴图支持VR渲染器
  • AWS WebRTC:通过shell分析viewer端日志文件
  • 深入解析享元模式:通过共享技术高效支持大量细粒度对象
  • 【力扣 简单 C】70. 爬楼梯
  • 【鸿蒙】鸿蒙操作系统发展综述
  • 递归与循环
  • 深入理解Reactor调试模式:Hooks.onOperatorDebug() vs ReactorDebugAgent.init()
  • 软件工程经济与伦理
  • 流水线(Jenkins)打包拉取依赖的时候提示无法拉取,需要登录私仓的解决办法
  • HTML知识复习2
  • HuggingFists: 无代码处理复杂PDF
  • 一个简单的网页设计
  • Vue Router 中,params参数的名称必须与路由配置中的动态路径参数名完全一致
  • Go语言基础之接口
  • CppCon 2018 学习:Sane and Safe C++ Class Types
  • FLAN-T5:规模化指令微调的语言模型
  • NumPy 函数库在数学建模中的基本使用方法
  • 电脑休眠控制工具,灵活设置防休眠
  • 通过 Windows 共享文件夹 + 手机访问(SMB协议)如何实现
  • Python(28)Python循环语句指南:从语法糖到CPython字节码的底层探秘
  • Everything 1.5.0.1393a高效实用的系统文件搜索工具(2025年7月4日更新)
  • 构建未来交互体验:AG-UI 如何赋能智能体与前端通信?
  • [论文阅读] 软件工程 | 可持续性标志在问答平台中的应用
  • AI语音训练——GPT-SoVITS(GSV)
  • Vue 笔记:动态绑定内联样式 :style 的关键语法注意事项
  • Spring Boot 框架创建一个简单的后端接口,并介绍如何使用 Apifox 连接该接口
  • Spring中实现依赖注入(DI)的三种方式
  • Spring Bean 生命周期 SmartLifecycle接口介绍和使用场景 和 Lifecycle对比