Java——单例类设计模式

embedded/2025/2/25 21:42:13/

在Java中,单例类(Singleton Class) 是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。单例模式通常用于管理共享资源(如数据库连接、线程池、配置管理器等),避免重复创建对象,节省系统资源。


1. 单例模式的核心特点

  1. 唯一实例:单例类只能有一个实例。
  2. 全局访问点:通过静态方法提供全局访问。
  3. 私有构造器:防止外部通过new关键字创建实例。
  4. 线程安全:确保在多线程环境下也能正常工作。

2. 单例模式的实现方式

以下是几种常见的单例模式实现方式:

2.1 饿汉式(Eager Initialization)
  • 特点:在类加载时创建实例,线程安全。
  • 优点:实现简单,线程安全。
  • 缺点:如果实例未被使用,会造成资源浪费。
示例
java">public class Singleton {// 在类加载时创建实例private static final Singleton INSTANCE = new Singleton();// 私有构造器private Singleton() {}// 全局访问点public static Singleton getInstance() {return INSTANCE;}
}

2.2 懒汉式(Lazy Initialization)
  • 特点:在第一次调用getInstance()时创建实例。
  • 优点:延迟加载,节省资源。
  • 缺点:线程不安全,需要额外处理多线程问题。
示例(非线程安全)
java">public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton(); // 非线程安全}return instance;}
}
改进(线程安全)
java">public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton(); // 线程安全}return instance;}
}

2.3 双重检查锁(Double-Checked Locking)
  • 特点:在懒汉式的基础上,通过双重检查减少同步开销。
  • 优点:延迟加载,线程安全,性能较好。
  • 缺点:实现稍复杂。
示例
java">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;}
}

2.4 静态内部类(Static Inner Class)
  • 特点:利用类加载机制保证线程安全,同时实现延迟加载。
  • 优点:线程安全,延迟加载,实现简单。
  • 缺点:无法传递参数。
示例
java">public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

2.5 枚举(Enum)
  • 特点:利用枚举的特性实现单例,线程安全,防止反射攻击。
  • 优点:线程安全,实现简单,防止反射和序列化破坏单例。
  • 缺点:不够灵活(无法延迟加载)。
示例
java">public enum Singleton {INSTANCE;public void doSomething() {System.out.println("Singleton is working.");}
}

3. 单例模式的应用场景

  1. 资源共享
    • 例如数据库连接池、线程池等。
  2. 配置管理
    • 例如全局配置管理器。
  3. 日志记录
    • 例如日志记录器。
  4. 缓存
    • 例如全局缓存管理器。

4. 单例模式的注意事项

  1. 线程安全
    • 确保在多线程环境下单例类的唯一性。
  2. 反射攻击
    • 通过反射可以调用私有构造器创建新实例。枚举单例可以防止反射攻击。
  3. 序列化与反序列化
    • 反序列化时可能会创建新的实例。可以通过实现readResolve()方法解决。
    • 示例:
      java">protected Object readResolve() {return getInstance();
      }
      
  4. 延迟加载
    • 根据需求选择合适的实现方式(如懒汉式、静态内部类等)。

5. 单例模式的优缺点

优点
  1. 节省资源:避免重复创建对象。
  2. 全局访问:方便共享资源。
  3. 线程安全:通过合理实现可以保证线程安全。
缺点
  1. 扩展性差:单例类通常难以扩展。
  2. 测试困难:单例类的全局状态可能导致测试困难。
  3. 违反单一职责原则:单例类通常承担过多职责。

6. 总结

单例模式是Java中常用的设计模式,用于确保一个类只有一个实例,并提供全局访问点。根据具体需求,可以选择饿汉式、懒汉式、双重检查锁、静态内部类或枚举等实现方式。在实际开发中,需注意线程安全、反射攻击和序列化等问题。


http://www.ppmy.cn/embedded/167130.html

相关文章

【游戏——BFS+分层图】

题目 分析 但凡是最优方案可能需要访问同一个点的情况,都需要应用“拆点”,或者说分层图的技巧。多出来的维度主要是区分同一个点的不同状态而用。 对于本题,访问的时机便是一个区分点。 对于类似题“AB路线”,同一个K段的位置是…

API接口设计模式:从分层架构到CQRS的实战应用

以下将从分层架构和 CQRS(命令查询职责分离)的基本概念入手,为你阐述从分层架构到 CQRS 的实战应用相关内容: 分层架构 概念:分层架构是将系统按照功能划分为不同的层次,每个层次负责特定的职责&#xff0c…

数据结构 1-2 线性表的链式存储-链表

1 原理 顺序表的缺点: 插入和删除移动大量元素数组的大小不好控制占用一大段连续的存储空间,造成很多碎片 链表规避了上述顺序表缺点 逻辑上相邻的两个元素在物理位置上不相邻 头结点 L:头指针 头指针:链表中第一个结点的存储…

Unity学习笔记-Unity了解,安装,简单配置(一)

Unity 是什么? Unity 是一款广受欢迎的跨平台游戏开发引擎,由 Unity Technologies 公司开发并推出。它以强大的功能和易用性,在游戏开发领域占据着举足轻重的地位,甚至可以说,它改变了游戏开发的格局。凭借其出色的跨…

基于数据可视化+SpringBoot+安卓端的数字化施工项目计划与管理平台设计和实现

博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…

关于ES中text类型时间字段范围查询的结构化解决方案

前言 有关es中text类型的时间字段范围查询的问题,比如: {"query": {"range": {"insertTime": {"gte": "2025-02-01T00:00:00","lte": "2025-11-30T23:59:59","format&quo…

图数据库Neo4j面试内容整理-路径查询

路径查询 是图数据库中的一个常见操作,它用于查找图中节点之间的路径。路径查询不仅可以用于找到两个节点之间的路径,还可以用于找到所有符合特定条件的路径、最短路径或带有特定属性的路径等。路径查询在图数据库中具有广泛的应用,例如社交网络中的朋友关系、推荐系统中的相…

嵌入式硬件篇---滤波器

文章目录 前言一、模拟电子技术中的滤波器1. 基本概念功能实现方式 2. 分类按频率响应低通滤波器高通滤波器带通滤波器带阻滤波器 按实现方式无源滤波器有源滤波器 3. 设计方法巴特沃斯滤波器(Butterworth)切比雪夫滤波器(Chebyshev&#xff…