java23种设计模式-单例模式

server/2025/2/28 23:23:02/

单例模式(Singleton Pattern)学习笔记

🌟 定义

单例模式属于创建型设计模式,确保一个类只有一个实例,并提供全局访问点。是Java中最简单但实现最复杂的设计模式


🎯 适用场景

  1. 需要控制资源访问(如数据库连接池)
  2. 全局配置对象
  3. 日志记录器
  4. 设备管理器(如打印机服务)
  5. 缓存系统
  6. 线程池/连接池管理

🔧 模式结构

📐 类图

Singleton
-static instance: Singleton
-Singleton()
+static getInstance()
+otherMethod()

🛠️ 核心组成

  1. 私有静态实例:存储唯一实例
  2. 私有构造方法:防止外部实例化
  3. 静态获取方法:全局访问入口
  4. 线程安全措施:保证多线程环境正确性

📝 代码实现(6种经典写法)

1. 饿汉式(线程安全)

public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton();private EagerSingleton() {// 防止反射攻击if (INSTANCE != null) {throw new IllegalStateException("Already initialized");}}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 SynchronizedSingleton {private static SynchronizedSingleton instance;private SynchronizedSingleton() {}public static synchronized SynchronizedSingleton getInstance() {if (instance == null) {instance = new SynchronizedSingleton();}return instance;}
}

4. 双重检查锁(DCL,线程安全)

public class DCLSingleton {private volatile static DCLSingleton instance;private DCLSingleton() {}public static DCLSingleton getInstance() {if (instance == null) {synchronized (DCLSingleton.class) {if (instance == null) {instance = new DCLSingleton();}}}return instance;}
}

5. 静态内部类(线程安全)

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

6. 枚举式(最佳实践,线程安全)

public enum EnumSingleton {INSTANCE;public void doSomething() {// 业务方法}
}

✅ 优点

  1. 严格控实例数量
  2. 全局唯一访问点
  3. 延迟初始化(部分实现)
  4. 减少内存开销(避免重复创建)
  5. 避免资源冲突

⚠️ 缺点

  1. 违反单一职责原则(同时控制创建和业务逻辑)
  2. 单元测试困难(全局状态难以隔离)
  3. 可能隐藏类间耦合关系
  4. 需要特殊处理序列化/反射攻击
  5. 长期持有可能造成内存泄漏

🔒 防御措施

1. 防止反射攻击

private Singleton() {if (instance != null) {throw new IllegalStateException("Already initialized");}
}

2. 防止序列化破坏

// 添加readResolve方法
protected Object readResolve() {return getInstance();
}

3. 防止克隆破坏

@Override
protected Object clone() throws CloneNotSupportedException {throw new CloneNotSupportedException();
}

🔄 实现对比

实现方式线程安全懒加载防止反射防止序列化性能
饿汉式⭐⭐⭐⭐
同步方法
双重检查锁⭐⭐⭐
静态内部类⭐⭐⭐⭐
枚举式⭐⭐⭐⭐

💡 实践建议

  1. 优先选择枚举实现(Effective Java推荐)
  2. 需要懒加载时用静态内部类方式
  3. 避免使用synchronized方法(性能差)
  4. 谨慎使用单例模式(考虑依赖注入)
  5. 注意与Spring单例的区别:

🚀 典型应用

  1. Runtime类(JDK内置单例)

    Runtime runtime = Runtime.getRuntime();
    
  2. 日志框架(LogManager)

    Logger logger = LogManager.getLogManager().getLogger("");
    
  3. Spring容器(ApplicationContext)

    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    

📌 扩展知识

1. 如何实现线程安全的延迟加载?

使用Initialization-on-demand holder惯用法(静态内部类实现)

2. volatile关键字的作用?

  • 保证可见性
  • 禁止指令重排序
  • 在DCL模式中防止返回未初始化完毕的对象

3. 为什么推荐枚举实现?

  • 自动处理序列化
  • 防止反射攻击
  • 保证线程安全
  • 代码简洁

掌握单例模式的关键在于理解实例控制线程安全的平衡,根据具体场景选择合适的实现方式。在分布式系统、类加载器不同的环境等特殊场景下需要特别注意单例的有效范围。


http://www.ppmy.cn/server/171409.html

相关文章

SDN架构详解

目录 1)经典的IP网络-分布式网络 2)经典网络面临的问题 3)SDN起源 4)OpenFlow基本概念 5)Flow Table简介 6)SDN的网络架构 7)华为SDN网络架构 8)传统网络 vs SDN 9&#xf…

蓝桥杯之日期题

文章目录 1.蓝桥杯必备知识点2. 题型13.需求2 1.蓝桥杯必备知识点 蓝桥杯是一个面向全国高校计算机相关专业学生的学科竞赛,涵盖多个赛道,常见的有软件类(如 C/C 程序设计、Java 软件开发、Python 程序设计)和电子类(…

Spring Core面试题

Spring Core面试题 基础概念 Q1: Spring的核心特性有哪些? public class SpringCoreBasicDemo {// 1. IoC容器public class IoCExample {public void iocDemo() {// XML配置Configurationpublic class AppConfig {Beanpublic UserService userService() {return …

Nmap使用指南

Nmap使用指南 Nmap (网络映射器) 是一款强大的应用网络扫描和安全核查工具,适合于网络管理和安全专家。本文将介绍Nmap的基本使用方法,包括基本命令和常用功能。 1. 基本使用方式 Nmap的基本命令格式如下: nmap [选项] 目标地址目标地址 可…

火狐浏览器多开指南:独立窗口独立IP教程

无论是跨境电商从业者需要管理多个店铺账号,还是海外社交媒体营销人员要运营多个社交平台账号,亦或是从事多账号广告投放的人员,都面临着一个共同的挑战 —— 如何高效管理多个账号,并确保每个账号的独立性。 在这种情况下&#…

蓝牙接近开关模块感应开锁手机靠近解锁支持HID低功耗

ANS-BT101M是安朔科技推出的蓝牙接近开关模块,低功耗ble5.1,采用UART通信接口,实现手机自动无感连接,无需APP,人靠近车门自动开锁,支持苹果、安卓、鸿蒙系统,也可以通过手机手动开锁或上锁&…

12. 三昧真火焚环劫 - 环形链表检测(快慢指针)

哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的环形山脉,山脉中有一条蜿蜒的火龙,它象征着环形链表。山脉的入口处有一块巨大的石碑,上面刻着一行文字:“欲破此山,需以三昧真火之力,焚环劫之链,快慢指针定环踪。” 哪吒定睛一看,石碑上还有一行小字…

矩阵营销的 AI 进化:DeepSeek 如何助力批量运营账号?

在数字营销的浪潮中,矩阵营销 已成为企业拓展市场、提升曝光的重要策略。然而,面对日益复杂的流量生态和平台风控,如何高效运营海量账号,同时保持内容的原创性和高转化率,成为营销人员的一大挑战。 随着 DeepSeek AI …