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

单例模式( 饿汉式与懒汉式 )

目录一、单例模式核心思想二、饿汉式单例类加载即初始化2.1 C 实现2.2 Java 实现2.3 饿汉式特点分析三、懒汉式单例延迟初始化按需创建3.1 C 实现3.2 Java 实现3.3 懒汉式的线程安全问题3.3.1 C 线程安全方案双检锁3.3.2 Java 线程安全方案静态内部类 / 枚举3.4 懒汉式特点分析四、饿汉式 vs 懒汉式核心对比五、单例模式的最佳实践六、总结在软件开发中单例模式Singleton Pattern是创建型设计模式的核心之一它保证一个类仅有一个实例并提供一个全局访问点避免重复创建对象带来的资源浪费同时保证状态一致性。本文将结合 C 和 Java 代码深入解析单例模式的两种经典实现饿汉式Eager Initialization与懒汉式Lazy Initialization帮你彻底理解其原理、差异与工程实践。一、单例模式核心思想单例模式的核心目标只有两个控制实例数量确保一个类在运行期间最多只存在一个实例。全局访问提供一个全局入口让任何地方都能获取到这个唯一实例。为了实现这两个目标单例模式必须满足三个约束构造函数私有化禁止外部通过new直接创建实例。禁用拷贝构造与赋值运算符防止实例被复制破坏唯一性。提供静态访问方法作为获取实例的唯一全局入口。二、饿汉式单例类加载即初始化饿汉式的核心思想是 **“急切初始化”**—— 在类加载阶段就创建好唯一实例不管后续是否会使用它就像 “饿汉” 一样迫不及待。2.1 C 实现#pragma once #include iostream // 饿汉模式 class Bully { public: // 禁用拷贝构造和赋值运算符 Bully(const Bully) delete; Bully operator(const Bully) delete; // 全局访问点返回唯一实例的引用 static Bully get() { return person; } private: // 私有构造函数禁止外部实例化 Bully() {} // 静态成员变量类加载时初始化 static Bully person; }; // 类外初始化静态成员必须自动调用构造函数 Bully Bully::person;2.2 Java 实现// 恶汉模式饿汉式 class SingletonBully { // 类加载时即创建实例private 保证外部无法直接访问 private static SingletonBully instance new SingletonBully(); // 私有构造函数 private SingletonBully() {} // 全局访问点 public static SingletonBully getInstance() { return instance; } }2.3 饿汉式特点分析优点缺点✅ 实现简单代码清晰❌ 类加载时即初始化可能造成内存浪费若实例从未使用✅ 天生线程安全类加载由 JVM/C 运行时保证❌ 无法延迟加载灵活性较低✅ 无锁性能极高❌ 不适合实例创建成本高、使用频率低的场景三、懒汉式单例延迟初始化按需创建懒汉式的核心思想是 **“延迟初始化”**—— 只有在第一次获取实例时才创建对象就像 “懒汉” 一样不到万不得已不干活。3.1 C 实现#pragma once #include iostream // 懒汉模式 class Fed { public: // 禁用拷贝构造和赋值运算符 Fed(const Fed) delete; Fed operator(const Fed) delete; // 全局访问点第一次调用时创建实例 static Fed get() { if (instance nullptr) { instance new Fed(); } return *instance; } private: // 私有构造函数 Fed() {} // 静态指针初始为 nullptr延迟初始化 static Fed* instance; }; // 类外初始化静态指针 //static Fed* instance nullptr; Fed* Fed::instance nullptr;⚠️ 注意static Fed* instance nullptr;多写了一个static正确写法是Fed* Fed::instance nullptr;。3.2 Java 实现// 懒汉模式 class SingletonFed { // 静态变量初始为 null延迟初始化 private static SingletonFed instance; // 私有构造函数 private SingletonFed() {} // 全局访问点第一次调用时创建实例 public static SingletonFed getInstance() { if (instance null) { instance new SingletonFed(); } return instance; } }3.3 懒汉式的线程安全问题基础版懒汉式在单线程环境下是安全的但在多线程环境下会出现问题多个线程同时进入if (instance null)判断可能导致多个实例被创建破坏单例约束。3.3.1 C 线程安全方案双检锁#include mutex class Fed { public: static Fed get() { // 第一次检查无锁提高性能 if (instance nullptr) { // 加锁保证只有一个线程能进入创建逻辑 std::lock_guardstd::mutex lock(mtx); // 第二次检查防止多线程重复创建 if (instance nullptr) { instance new Fed(); } } return *instance; } private: static Fed* instance; static std::mutex mtx; // 互斥锁 }; Fed* Fed::instance nullptr; std::mutex Fed::mtx;3.3.2 Java 线程安全方案静态内部类 / 枚举静态内部类推荐利用类加载机制实现延迟初始化与线程安全。class SingletonFed { private SingletonFed() {} // 静态内部类只有在被调用时才会加载延迟初始化 private static class Holder { private static final SingletonFed INSTANCE new SingletonFed(); } public static SingletonFed getInstance() { return Holder.INSTANCE; } }枚举最安全Java 枚举天然保证单例且防止反射与序列化破坏单例。enum SingletonFed { INSTANCE; public void doSomething() { // 业务逻辑 } }3.4 懒汉式特点分析优点缺点✅ 延迟加载只有在第一次使用时才创建实例节省内存❌ 基础版线程不安全需要额外处理加锁 / 静态内部类✅ 适合实例创建成本高、使用频率低的场景❌ 加锁版本会带来一定性能开销✅ 灵活性高可根据业务场景调整初始化时机❌ 实现复杂度略高于饿汉式四、饿汉式 vs 懒汉式核心对比对比维度饿汉式懒汉式实例创建时机类加载阶段第一次获取实例时线程安全天生安全基础版不安全需额外处理内存占用类加载时即占用可能浪费延迟占用按需分配性能无锁性能极高加锁版本性能略低实现复杂度简单略复杂需处理线程安全适用场景实例小、使用频繁实例大、使用频率低五、单例模式的最佳实践优先考虑饿汉式如果实例创建成本低、使用频繁饿汉式是最简单高效的选择。延迟加载用懒汉式如果实例创建成本高如连接池、大对象且可能不会被使用选择懒汉式。Java 推荐枚举 / 静态内部类枚举是最安全的单例实现静态内部类是延迟初始化的优雅方案。C 推荐 C11 静态局部变量C11 后静态局部变量的初始化是线程安全的可极简实现懒汉式class Fed { public: static Fed get() { static Fed instance; // 线程安全的延迟初始化 return instance; } private: Fed() {} };警惕单例的滥用单例模式会引入全局状态增加代码耦合度不利于单元测试需谨慎使用。六、总结单例模式是软件开发中最常用的设计模式之一饿汉式和懒汉式是其两种核心实现饿汉式以空间换时间简单高效线程安全。懒汉式以时间换空间延迟加载需处理线程安全。在实际开发中应根据业务场景选择合适的实现方式同时注意单例模式的局限性避免过度使用。

相关文章:

单例模式( 饿汉式与懒汉式 )

目录 一、单例模式核心思想 二、饿汉式单例:类加载即初始化 2.1 C 实现 2.2 Java 实现 2.3 饿汉式特点分析 三、懒汉式单例:延迟初始化,按需创建 3.1 C 实现 3.2 Java 实现 3.3 懒汉式的线程安全问题 3.3.1 C 线程安全方案&#xf…...

FastAPI+Diffusers架构解析:造相-Z-Image-Turbo Web服务多LoRA热切换实现原理

FastAPIDiffusers架构解析:造相-Z-Image-Turbo Web服务多LoRA热切换实现原理 1. 引言:当AI绘画遇上Web服务 想象一下,你正在为一个电商项目设计产品海报,需要生成一批具有统一“亚洲美学”风格的模特图片。传统方法要么是找设计…...

AWPortrait-Z多模型对比测试:寻找最佳人像美化方案

AWPortrait-Z多模型对比测试:寻找最佳人像美化方案 人像美化技术发展迅速,但哪个模型才能真正满足你的需求?本文通过实测对比,帮你找到答案。 人像美化一直是AI图像处理的热门领域,从早期的简单磨皮到现在的智能光影优…...

PP-DocLayoutV3入门指南:Gradio界面各控件功能详解与常见报错解决

PP-DocLayoutV3入门指南:Gradio界面各控件功能详解与常见报错解决 1. 引言 如果你正在处理大量的扫描文档、合同或者论文,想把图片里的文字、表格、图片位置都自动识别出来,那么PP-DocLayoutV3这个工具可能就是你在找的解决方案。简单来说&…...

DFRobot_ST7687S TFT LCD驱动详解:SPI显示模块硬件与API实战

1. 项目概述DFRobot_ST7687S 是一款基于 ST7687S 显示驱动芯片的 2.2 英寸 TFT LCD 显示模块(SKU: DFR0529),采用 30Pin 焊接式 FPC 接口,分辨率为 128128 像素。该模块专为嵌入式系统设计,支持全彩动态显示&#xff0…...

实测GLM-4v-9B:比GPT-4更强的图像理解,免费商用教程

实测GLM-4v-9B:比GPT-4更强的图像理解,免费商用教程 1. 环境准备与快速部署 1.1 系统要求 操作系统:Linux/Windows/macOSGPU:NVIDIA显卡(建议RTX 4090及以上)显存:24GB(FP16精度&…...

ESP32轻量级运动检测库:JPEG缓冲区双模态分析

1. 项目概述ESP_Camera_Motion_Detect 是一个面向 ESP32 平台的轻量级、低资源占用运动检测库,专为资源受限的嵌入式视觉应用设计。其核心目标并非实现通用计算机视觉算法(如光流、背景建模或深度学习推理),而是通过高度工程化的 …...

BMP085气压传感器驱动开发与校准算法详解

1. BMP085气压传感器底层驱动技术解析BMP085是博世(Bosch)推出的高精度数字式气压与温度复合传感器,采用MEMS微机电技术制造,具备IC接口、低功耗、小尺寸(3.63.60.94 mm)和工业级工作温度范围(−…...

李慕婉-仙逆-造相Z-Turbo快速入门:Python调用API生成第一张图像

李慕婉-仙逆-造相Z-Turbo快速入门:Python调用API生成第一张图像 想用AI画一张图,但面对复杂的界面和参数一头雾水?或者想在自己的程序里集成AI绘画功能,却不知道从何下手?今天,我们就来聊聊一个特别适合新…...

手把手用STM32CubeMX配置IIC驱动OLED屏(附SPI改造成本分析)

STM32CubeMX实战:IIC驱动OLED屏与SPI改造决策指南 开篇:为什么OLED驱动对嵌入式开发者如此重要? 0.96寸OLED显示屏已成为嵌入式项目的"标配外设",从智能手环的微型UI到工业设备的参数监视,这种高对比度、低功…...

OpenClaw+GLM-4.7-Flash智能客服实践:自动问答系统搭建

OpenClawGLM-4.7-Flash智能客服实践:自动问答系统搭建 1. 为什么选择这个技术组合 去年夏天,我接手了一个小团队的客服系统改造需求。这个五人团队每天要处理上百条用户咨询,内容从产品使用到售后政策不一而足。传统的关键词匹配机器人效果…...

Arduino嵌入式分数库Fraction:精准有理数运算与显示

1. 项目概述Fraction是一个面向 Arduino 平台的轻量级 C 库,专为嵌入式系统中精确表示和运算有理数(即形如 $ a/b $ 的分数)而设计。其核心目标并非替代浮点运算,而是解决一类典型嵌入式场景中的显示精度、用户可读性与数学语义一…...

Canvas Quest赋能在线教育:个性化学习助手形象定制

Canvas Quest赋能在线教育:个性化学习助手形象定制 1. 教育科技的新需求 在线教育行业近年来发展迅猛,但同时也面临着同质化严重、学员参与度低等挑战。传统视频课程往往缺乏互动性和个性化元素,学员容易感到枯燥乏味。教育机构和知识付费平…...

竞争冒险全解析:从识别到消除的完整指南(含代数法与卡诺图法对比)

竞争冒险全解析:从识别到消除的完整指南(含代数法与卡诺图法对比) 在数字电路设计中,竞争冒险是一个让工程师们头疼不已的问题。想象一下,你精心设计的电路在仿真时一切正常,但在实际运行中却出现了莫名其妙…...

CublasLt 高效矩阵乘法实战指南

1. 为什么你需要关注CublasLt矩阵乘法 第一次接触CublasLt时,我和大多数开发者一样有个疑问:已经有成熟的cuBLAS库了,为什么还要折腾这个"轻量版"?直到在真实项目中处理一批256x256的矩阵运算时,传统方法耗时…...

Zookeeper未来发展趋势:云原生时代的演进方向

好的,技术博主!这是一篇为你量身定制的、探讨Zookeeper在云原生时代发展趋势的技术博客文章。我将按照你要求的详细结构、字数目标和风格进行撰写。 标题选项: Zookeeper的云原生蜕变:从分布式协调到K8s原生时代 (推荐)解析Zooke…...

昇腾310P实战:vLLM部署Qwen3的性能调优与瓶颈分析

1. 昇腾310P与vLLM部署Qwen3的现状分析 最近在Atlas 300I推理卡上部署vLLM运行Qwen3模型,实测下来解码速度只有2.5 tokens/s(4卡并行)。这个速度对于实际应用来说确实不太理想,但考虑到vLLM对昇腾310P的支持才刚刚开始&#xff0c…...

WNCInterface嵌入式蜂窝网络接口库详解

1. WNCInterface 库概述 WNCInterface 是一个面向嵌入式蜂窝物联网应用的 C 网络接口库,专为 Wistron NeWeb Corporation(WNC)M14A2A 系列 LTE-M/NB-IoT 数据模块设计。其核心定位是作为 EthernetInterface 类的 零侵入式(dro…...

ESP8266非阻塞DMX渐变库:轻量级线性插值控制方案

1. 项目概述DMXFader 是一款专为 ESP8266 平台设计的轻量级、非阻塞式 DMX 通道渐变控制库,其核心目标是解耦灯光动画逻辑与主程序执行流。该库并非直接操作物理 DMX 总线,而是作为上层调度器,与底层ESP-Dmx库协同工作——前者负责时间维度上…...

[特殊字符]️ MusePublic入门必看:艺术人像生成中的光线物理模型基础

MusePublic入门必看:艺术人像生成中的光线物理模型基础 1. 项目概述:专为艺术人像而生的智能创作引擎 MusePublic是一款专门为艺术感时尚人像创作设计的轻量化文本生成图像系统。这个项目的核心基于专属大模型,采用安全高效的技术格式封装&…...

Qwen3-ASR-1.7B跨平台部署:Windows与Linux性能对比

Qwen3-ASR-1.7B跨平台部署:Windows与Linux性能对比 1. 引言 语音识别技术正在快速改变我们与设备交互的方式,而Qwen3-ASR-1.7B作为最新的开源语音识别模型,凭借其支持52种语言和方言的能力,成为了开发者关注的焦点。但在实际部署…...

Linux下iSCSI服务端配置全攻略:从tgtadm基础到CHAP认证实战

Linux下iSCSI服务端配置全攻略:从tgtadm基础到CHAP认证实战 在当今企业级存储解决方案中,iSCSI凭借其基于IP网络的灵活性和成本效益,成为构建存储区域网络(SAN)的热门选择。不同于传统的FC-SAN需要专用硬件,iSCSI允许通过标准以太…...

智能感知编码:从技术原理到行业落地

1. 智能感知编码的技术背景 视频内容爆炸式增长的时代已经到来。从短视频平台到在线教育,从直播电商到远程医疗,高清视频正成为信息传递的主要载体。但随之而来的带宽成本压力也让从业者头疼不已——数据显示,某头部短视频平台每月带宽成本高…...

RS-485接口实战避坑指南:从终端电阻到EMC防护的完整配置流程

RS-485接口实战避坑指南:从终端电阻到EMC防护的完整配置流程 在工业自动化现场调试中,RS-485总线的稳定性往往决定着整个系统的可靠性。记得去年参与某钢铁厂轧机控制系统改造时,一个简单的终端电阻配置错误导致整条产线通信中断8小时——这种…...

PP-DocLayoutV3技术解析:其视觉Transformer骨干网络设计

PP-DocLayoutV3技术解析:其视觉Transformer骨干网络设计 文档智能处理,比如从一张扫描的合同或报告里自动识别出标题、段落、表格和图片,听起来简单,做起来却不容易。传统的模型在处理复杂的版面,尤其是那些元素之间距…...

RMBG-2.0AR内容准备:为Unity/Unreal引擎快速提供带Alpha通道素材

RMBG-2.0:为Unity/Unreal引擎快速提供带Alpha通道素材 你是不是也遇到过这样的场景?在Unity或Unreal引擎里做项目,好不容易找到一张完美的角色原画、一个酷炫的武器模型贴图,或者一个绝佳的环境素材,结果发现它没有透…...

科研助手:OpenClaw+Qwen3-32B自动整理文献与生成综述

科研助手:OpenClawQwen3-32B自动整理文献与生成综述 1. 为什么需要AI科研助手? 作为一名经常需要阅读大量文献的研究者,我发现自己花费在文献整理和综述写作上的时间越来越多。每次开始一个新课题,都要经历下载几十篇PDF、快速浏…...

Pixel Dimension Fissioner保姆级教学:离线环境部署像素工坊及本地模型缓存策略

Pixel Dimension Fissioner保姆级教学:离线环境部署像素工坊及本地模型缓存策略 1. 工具介绍与核心价值 Pixel Dimension Fissioner(像素语言维度裂变器)是一款基于MT5-Zero-Shot-Augment核心引擎构建的文本改写与增强工具。它将传统AI工具…...

Step3-VL-10B-Base辅助计算机组成原理教学:CPU架构图智能讲解

Step3-VL-10B-Base辅助计算机组成原理教学:CPU架构图智能讲解 1. 引言:当图解助教走进课堂 计算机组成原理这门课,很多同学都有过类似的体验:面对教材里那些密密麻麻的CPU微架构图、数据通路图,感觉就像在看一张复杂…...

ESP32高精度时间同步数据记录组件esp_datalogger

1. 项目概述esp_datalogger是一个专为 ESP32 系列微控制器(基于 ESP-IDF 开发框架)设计的轻量级、高精度数据记录与时间同步组件。它并非通用型日志库,而是面向工业测量与控制(M&C)场景深度优化的嵌入式数据处理中…...