单例模式 超详细完整版
一、单例模式是什么单例模式Singleton是创建型设计模式。核心定义保证一个类在整个程序运行中有且仅有一个实例对象并提供一个全局访问入口。二、单例模式三大核心特点必背私有构造方法禁止外部 new 对象私有静态实例类内部唯一对象公共静态方法全局唯一获取实例入口三、单例解决什么问题避免重复创建对象节省内存全局统一资源管控连接池、配置类、工具类保证操作唯一性日志、计数器、线程池四、两大分类饿汉式类加载时直接创建实例 →无懒加载、线程安全懒汉式使用时才创建实例 →懒加载、省内存、需要解决线程安全五、八种实现方式1. 饿汉式静态常量【可用、简单】特点类加载直接初始化天生线程安全javapublic class Singleton { // 1. 静态常量实例 private static final Singleton instance new Singleton(); // 2. 私有构造 private Singleton(){} // 3. 全局获取 public static Singleton getInstance(){ return instance; } }✅ 优点简单、无锁、线程绝对安全、性能高 ❌ 缺点无懒加载类加载就创建不用也占内存2. 饿汉式静态代码块适合需要初始化额外资源javapublic class Singleton { private static Singleton instance; static { instance new Singleton(); } private Singleton(){} public static Singleton getInstance(){ return instance; } }3. 懒汉式线程不安全特点用时才创建多线程会创建多个实例javapublic class Singleton { private static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance null){ instance new Singleton(); } return instance; } }❌ 致命问题多线程并发会创建多个对象4. 懒汉式同步方法javapublic class Singleton { private static Singleton instance; private Singleton(){} // 加锁 public static synchronized Singleton getInstance(){ if(instance null){ instance new Singleton(); } return instance; } }✅ 线程安全 ❌每次获取都加锁高并发性能极差5. 懒汉式同步代码块java// 错误不能保证单例 public static Singleton getInstance(){ if(instance null){ synchronized (Singleton.class){ instance new Singleton(); } } return instance; }❌双重检查缺失第一层锁判断多线程依旧会重复创建6. 双重检查锁 DCL终极优化懒加载 线程安全 高性能javapublic class Singleton { // volatile 禁止指令重排核心 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面试必考new 对象底层三步开辟内存空间初始化对象赋值给 instanceCPU 指令重排可能变成1→3→2 导致其他线程拿到半初始化对象程序报错。volatile 作用禁止指令重排、保证可见性✅ 优点懒加载、线程安全、并发高性能 ❌ 写法稍复杂、需要理解 volatile7. 静态内部类单例javapublic class Singleton { // 私有构造 private Singleton(){} // 静态内部类外部类加载不会加载内部类 private static class Inner{ private static final Singleton INSTANCE new Singleton(); } public static Singleton getInstance(){ return Inner.INSTANCE; } }原理满分解释外部类加载不加载内部类→ 实现懒加载内部类静态变量初始化由 JVM 保证线程安全调用getInstance()才加载内部类创建唯一实例✅ 懒加载 ✅ 无锁、性能极高 ✅ JVM 天然线程安全 面试最推荐、代码简洁、无坑❌ 缺点无法防止反射破坏单例8. 枚举单例javapublic enum Singleton { INSTANCE; // 自定义方法 public void doSomething(){ System.out.println(业务方法); } }使用javaSingleton.INSTANCE.doSomething();最强优点绝对线程安全杜绝反射破坏、序列化破坏写法极简天然单例、不会多创建✅Java 官方公认最完美单例❌ 不支持懒加载类加载直接初始化六、四大破坏单例的方式 防护1. 反射破坏通过暴力反射创建新对象除了枚举全部可破。枚举天然防反射2. 序列化破坏对象序列化再反序列化会生成新对象。 枚举天然防序列化。3. 克隆破坏重写 clone 方法会产生新对象。4. 多线程并发普通懒汉式无锁直接失效。七、八种单例终极对比表背诵版表格方式懒加载线程安全性能防反射推荐度饿汉静态常量❌✅极高❌⭐⭐⭐饿汉静态代码块❌✅极高❌⭐⭐⭐普通懒汉✅❌高❌❌废弃同步方法懒汉✅✅极低❌⭐⭐同步代码块懒汉✅❌高❌❌错误DCL 双重检查✅✅极高❌⭐⭐⭐⭐静态内部类✅✅极高❌⭐⭐⭐⭐⭐枚举❌✅极高✅⭐⭐⭐⭐⭐⭐八、开发中到底用哪个需要懒加载、高性能、无漏洞 → 静态内部类高并发、框架底层、绝对安全 → 枚举简单工具类、无需懒加载 → 饿汉式面试手写最优代码 → DCL / 静态内部类九、单例模式真实业务场景Spring Bean 默认单例数据库连接池Redis 连接工具类全局配置类、系统参数日志工具、计数器线程池对象系统缓存管理器十、面试高频问答1. DCL 为什么要 volatile防止 JVM 指令重排避免线程获取半初始化对象保证多线程安全。2. 静态内部类原理利用外部类不加载内部类实现懒加载利用JVM 静态初始化线程安全保证单例。3. 枚举为什么是最完美单例JVM 底层禁止反射枚举构造方法天然杜绝反射、序列化、多线程问题。4. 饿汉和懒汉区别饿汉类加载创建无懒加载、省锁、费内存 懒汉用时创建懒加载、省内存、需要控线程安全

相关新闻

口碑出众的精准尺寸烤盘定制厂家

口碑出众的精准尺寸烤盘定制厂家

做工业化烘焙生产的技术和采购人员都懂,烤盘尺寸哪怕只有1mm的误差,放到自动化隧道炉、连续生产线上就容易出现卡盘、跳盘问题,轻则耽误生产进度,重则刮坏传输设备、提升产品报废率,因此找到靠谱的烘焙器具定制厂家&am…

2026/7/3 4:59:20 阅读更多 →
基于STM32的智能手环设计与实现

基于STM32的智能手环设计与实现

摘要:为满足对人体基础生理信息与日常活动状态的综合监测需求,设计了一套基于STM32的智能手环系统。系统以STM32F103C8T6为控制核心,结合MAX30102心率血氧传感器、DS18B20温度传感器、ADXL345加速度传感器、OLED显示屏、按键、蜂鸣器及ESP826…

2026/7/3 4:57:19 阅读更多 →
2026 年 7 月 openclaw 龙虾替代品推荐 九款分场景商用AI智能体实测对比参考

2026 年 7 月 openclaw 龙虾替代品推荐 九款分场景商用AI智能体实测对比参考

前言 OpenClaw 俗称龙虾,作为海外开源 AI 智能体框架,依托自主操控电脑、多技能扩展的能力积累不少使用者,但原版工具存在部署流程繁琐、国内网络适配度有限、数据跨境存在合规压力、中文长任务运行稳定性一般等现实使用门槛。2026 年国内市场…

2026/7/3 4:57:19 阅读更多 →

最新新闻

Linux 系统编程 09:线程基础

Linux 系统编程 09:线程基础

前言:承接上一篇 System V IPC 三大进程间通信机制,多进程模型实现了任务并发,但进程间切换开销大、通信成本高,在高频并发场景下并非最优解。本篇引入更轻量的并发执行单元 —— 线程,讲解 Linux 线程的底层本质、POS…

2026/7/3 6:01:32 阅读更多 →
深入浅出Linux

深入浅出Linux

Linux 操作系统概述Linux 是一种开源的类 Unix 操作系统内核,由 Linus Torvalds 于 1991 年首次发布。其设计遵循 Unix 哲学,强调模块化、简洁性和高效性。Linux 内核是操作系统的核心组件,负责管理硬件资源、进程调度和系统安全。由于其开源…

2026/7/3 5:59:32 阅读更多 →
Python计算机毕设之基于 Python 的在线图书阅览智能推荐管理系统的设计与实现 基于 Python 的书籍评分溯源智能推荐系统(完整前后端 代码+说明文档+LW,调试定制等)

Python计算机毕设之基于 Python 的在线图书阅览智能推荐管理系统的设计与实现 基于 Python 的书籍评分溯源智能推荐系统(完整前后端 代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/3 5:57:31 阅读更多 →
告别 GitOps 翻车!7 招让 ArgoCD 稳如老狗

告别 GitOps 翻车!7 招让 ArgoCD 稳如老狗

希望能给正在或即将上 GitOps 的兄弟们一些参考。七步法:让 ArgoCD 更稳、更隔离、更可控之前的文章介绍了 ArgoCD 的基本用法,但生产环境,光会配还不够,还得配得好。这次我们不讲概念,直接上实战要点,看看…

2026/7/3 5:55:31 阅读更多 →
Claude-Code源码解读--自主运行模式ProActive篇 --持续更新中...

Claude-Code源码解读--自主运行模式ProActive篇 --持续更新中...

这是 Claude Code 的一种自主运行模式&#xff1a;没人发消息时&#xff0c;Claude 也会自己找事做。没人说话时 Claude 自己找活干核心行为&#xff1a;自己驱动对话 — 不等用户下指令&#xff0c;会主动探索、执行、推进任务周期性唤醒 — 系统会发 <tick> 提示&#…

2026/7/3 5:55:31 阅读更多 →
SkillBridge:如何用Python无缝对接Cadence Virtuoso实现EDA自动化?

SkillBridge:如何用Python无缝对接Cadence Virtuoso实现EDA自动化?

SkillBridge&#xff1a;如何用Python无缝对接Cadence Virtuoso实现EDA自动化&#xff1f; 【免费下载链接】skillbridge A seamless python to Cadence Virtuoso Skill interface 项目地址: https://gitcode.com/gh_mirrors/sk/skillbridge 在电子设计自动化&#xff0…

2026/7/3 5:51:30 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述&#xff1a;为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473&#xff0c;一个关于TLS/SSL协议重协商机制的漏洞&#xff0c;现在提起来还有必要吗&#xff1f;很多运维和开发朋友可能会觉得&#xff0c;这都老掉牙了&#xff0c;现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述&#xff1a;为什么需要双通道远程管理防火墙&#xff1f;在任何一个稍具规模的企业网络里&#xff0c;防火墙都是那个默默守护在边界的关键角色。作为网络工程师&#xff0c;我们不可能每次都跑到机房&#xff0c;插上console线去配置它。远程管理能力&#xff0c;…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述&#xff1a;AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域&#xff0c;同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件&#xff0c;与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻