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

单例模式深度解析:从原理到高阶应用实践

在这里插入图片描述

第一章:单例模式基础理论

1.1 设计模式概述

设计模式是软件工程中解决常见问题的经典方案,是前辈开发者经验的结晶。1994年由GoF提出的23种设计模式分为三大类:

  • 创建型模式(5种)
  • 结构型模式(7种)
  • 行为型模式(11种)

单例模式(Singleton Pattern)作为创建型模式中最基础也是最常被讨论的模式,其核心价值在于确保全局唯一性和受控访问。

1.2 单例模式定义

官方定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

核心要素

  1. 私有静态实例变量
  2. 私有构造方法
  3. 公共静态访问方法
  4. (可选)线程安全措施
  5. (可选)防反射/序列化攻击机制

UML类图

+------------------+
|   Singleton      |
+------------------+
| - instance: Singleton |
+------------------+
| - Singleton()    |
| + getInstance(): Singleton |
+------------------+

1.3 应用场景分析

适合场景包括:

  • 配置信息管理器
  • 数据库连接池
  • 日志记录器
  • 硬件接口访问
  • 应用级缓存系统
  • 线程池管理
  • 状态管理服务

典型特征:

  • 需要严格控制资源访问
  • 频繁创建销毁成本高
  • 需要全局状态协调
  • 共享资源配置管理

第二章:经典实现方式剖析

2.1 饿汉式(Eager Initialization)

public class EagerSingleton {private static final EagerSingleton instance = new EagerSingleton();private EagerSingleton() {// 防止反射攻击if (instance != null) {throw new RuntimeException("Use getInstance() method to get the single instance.");}}public static EagerSingleton getInstance() {return instance;}
}

特点

  • 类加载时立即初始化
  • 线程安全由JVM类加载机制保证
  • 无法延迟加载
  • 可能造成资源浪费

类加载时机

  1. new关键字实例化
  2. 反射调用
  3. 子类被初始化
  4. 主类被指定为程序入口

2.2 懒汉式(Lazy Initialization)

基础版:

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

优化方向

  • 减少同步锁粒度
  • 使用双重检查锁定
  • 避免指令重排序

2.3 双重检查锁(Double-Checked Locking)

public class DCLSingleton 
http://www.xdnf.cn/news/481087.html

相关文章:

  • 麒麟桌面系统文件保险箱快捷访问指南:让重要文件夹一键直达桌面!
  • [MySQL实战] 主从复制(Replication)搭建教程:实现读写分离与高可用基础
  • 项目QT+ffmpeg+rtsp(一)——Qt的安装和rtsp的测试
  • python的家教课程管理系统
  • spring cloud gateway 源码解析
  • 嵌入式单片机中STM32F1演示寄存器控制方法
  • Linux系统编程——exec族函数
  • 【生成式AI文本生成实战】DeepSeek系列应用深度解析
  • Crowdfund Insider聚焦:CertiK联创顾荣辉解析Web3.0创新与安全平衡之术
  • day22-数据结构之 栈队列
  • git版本控制学习
  • AB Download Manager v1.5.8 开源免费下载工具
  • AI 编程 “幻觉” 风险频发?飞算 JavaAI 硬核技术筑牢安全防线
  • 1688代采系统商品采集下单支付解决方案|官方API接口接入指南
  • Android从单体架构迁移到模块化架构。你会如何设计模块划分策略?如何处理模块间的通信和依赖关系
  • 开源轻量级地图解决方案leaflet
  • Mac安装Navicat16
  • mac的Cli为什么输入python3才有用python --version显示无效,pyenv入门笔记,如何查看mac自带的标准库模块
  • 前端面经 手写Promise
  • GTS-400 系列运动控制器板卡介绍(三十五)---读取运动控制器版本号
  • 大语言模型 09 - 从0开始训练GPT 0.25B参数量 补充知识之数据集 Pretrain SFT RLHF
  • 车道线检测----CLRKDNet
  • 【CanMV K230】AI_CUBE1.4
  • mac中加载C++动态库文件
  • RK3568-鸿蒙5.1镜像烧录与调试
  • 不同坐标系下MATLAB绘制阵列的方向图
  • Gen5 应用实例
  • Qwen3技术报告解读:训练秘籍公开,推理与非推理模型统一,大模型蒸馏小模型(报告详细解读)
  • H3C网络设备(交换机、路由器、防火墙)常用命令整理
  • 德劳内三角剖分原理