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

单例模式:C++实现与多线程安全

1. 核心定义与作用精准版定义单例模式是一种创建型设计模式确保一个类有且仅有一个实例并向整个系统提供唯一的全局访问点。核心作用控制实例数量严格保证类在程序生命周期内只有一个对象全局访问无需传递对象在代码任意位置获取同一个实例解决实际问题避免多实例竞争资源日志文件、数据库连接、配置文件、打印机减少频繁创建 / 销毁对象的性能开销统一数据状态保证全局数据一致性2. 实现方式饿汉式 vs 懒汉式对比 代码一、饿汉式静态初始化核心类加载时就创建实例以空间换时间cpp// 饿汉式单例线程安全无需加锁 class Singleton { private: // 1. 构造函数私有化 Singleton() default; // 2. 禁用拷贝、赋值 Singleton(const Singleton) delete; Singleton operator(const Singleton) delete; // 3. 静态实例类加载时初始化 static Singleton instance; public: // 4. 全局访问点 static Singleton getInstance() { return instance; } }; // 类外初始化 Singleton Singleton::instance;优点天然线程安全由静态初始化保证无锁竞争访问速度快实现简单无坑缺点程序启动就初始化即使不用也占内存大对象会延长启动时间无法做到延迟加载适用场景实例小、一定会使用、追求高性能二、懒汉式延迟初始化核心第一次使用时才创建实例以时间换空间① 基础版线程不安全cppstatic Singleton* getInstance() { if (instance nullptr) { // 多线程下会多次进入 instance new Singleton(); } return instance; }问题高并发下会创建多个实例破坏单例。3. 多线程安全与优化面试核心① 加锁版线程安全但效率低cppstatic Singleton* getInstance() { std::lock_guardstd::mutex lock(mtx); // 每次都加锁 if (instance nullptr) { instance new Singleton(); } return instance; }缺点99% 的情况实例已存在仍要加锁并发性能极差。② 双重检查锁 DCLDouble-Checked Locking面试必考为什么要两次判断第一次判断避免每次都加锁第二次判断防止多线程同时通过第一次判断cppstatic Singleton* getInstance() { if (instance nullptr) { // 第一次检查无锁 std::lock_guardstd::mutex lock(mtx); if (instance nullptr) { // 第二次检查有锁 instance new Singleton(); } } return instance; }致命问题指令重排new分为三步分配内存调用构造函数指针赋值给 instance编译器可能优化为1 → 3 → 2导致其他线程拿到未构造完成的半成品对象程序崩溃。C11 解决方案使用std::atomic 内存屏障禁止重排。③ Meyers 单例C 最优写法强烈推荐C11 特性静态局部变量初始化是线程安全的cppclass Singleton { private: Singleton() default; Singleton(const Singleton) delete; Singleton operator(const Singleton) delete; public: static Singleton getInstance() { static Singleton instance; // 线程安全延迟加载 return instance; } };优点延迟加载天然线程安全无锁、无指针、无内存泄漏代码极简、无坑这是 C 工程与面试首选写法4. C 单例必写规范面试必问① 必须私有化构造函数防止外部new创建对象。② 必须禁用拷贝构造 赋值运算符cppSingleton(const Singleton) delete; Singleton operator(const Singleton) delete;防止通过拷贝产生新实例。③ 析构函数一般私有化单例由类管理生命周期外部不能 delete。④ 实例类型选择饿汉静态对象栈 / 全局区懒汉静态局部对象推荐不推荐裸指针内存泄漏风险5. 单例生命周期与内存管理静态实例程序结束时自动释放无需手动管理指针实例需要手动写destroy()释放否则内存泄漏依赖顺序多个单例互相依赖时可能出现析构顺序问题最佳方案使用 Meyers 单例完全交给系统管理6. 单例模式优缺点总结优点严格控制唯一实例全局访问方便避免重复创建销毁开销避免资源竞争冲突缺点扩展性差很难改成多例隐藏依赖关系多线程下实现复杂基础版不安全不利于单元测试难以 mock

相关文章:

单例模式:C++实现与多线程安全

1. 核心定义与作用(精准版)定义单例模式是一种创建型设计模式,确保一个类有且仅有一个实例,并向整个系统提供唯一的全局访问点。核心作用控制实例数量:严格保证类在程序生命周期内只有一个对象全局访问:无需…...

C++虚函数机制深度解析:从原理到实战

1. 核心概念与多态实现多态的定义:多态是指“以一个接口,多种实现”的能力。在 C 中,通过在基类中使用 virtual 关键字声明函数,可以实现动态绑定(Dynamic Binding),即在运行时根据对象的实际类…...

Sunshine游戏串流完全指南:打造你的私人游戏云服务

Sunshine游戏串流完全指南:打造你的私人游戏云服务 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否梦想着在任何设备上都能流畅地玩PC游戏?Sunshine正…...

工业物联网实战:从预测性维护到系统优化,制造业数字化转型核心解析

1. 制造业的“静默革命”:当产线开始“思考”如果你在制造业干了十年以上,最近几年可能会有一个越来越强烈的感觉:车间里的机器好像“活”过来了。这不再是科幻电影的桥段,而是一场正在发生的、静默但深刻的革命。过去&#xff0c…...

N_m3u8DL-RE如何深度解析加密流媒体:架构设计与实战优化指南

N_m3u8DL-RE如何深度解析加密流媒体:架构设计与实战优化指南 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL…...

2026中国DevOps平台选型全景洞察:技术适配与效能跃升的深层思考

在中国企业数字化转型浪潮中,DevOps平台作为技术基础设施的核心组件,其选型决策正经历从单纯功能对比向多维度综合评估的转变。2026年,这一选择不再是简单的工具采购,而是关乎企业技术战略、业务发展和合规安全的关键决策。通过对…...

CANN/oam-tools安全声明

安全声明 【免费下载链接】oam-tools 本项目为开发者提供故障定位工具,包含故障信息收集,软硬件信息展示,AI core error报错分析等能力,提升故障问题定位效率,文档可在昇腾社区搜索“故障处理简介”(选择社…...

Gitee与OpenSCA的深度整合:构建企业级开源治理新范式

在数字化转型浪潮中,开源技术已成为企业创新的重要驱动力。然而,伴随开源组件广泛应用而来的安全风险与合规挑战也日益严峻。Gitee作为国内领先的代码托管平台,选择与OpenSCA深度集成,打造了一套完整的开源治理解决方案&#xff0…...

NeuroRebuild 动态孪生,虚实同步秒级应急推演

NeuroRebuild 动态孪生,虚实同步秒级应急推演前言危化园区危险源密集、事故蔓延快、应急处置窗口期极短,传统静态BIM、倾斜摄影孪生模型固化滞后,无法跟随现场实景实时变化,灾害推演失真滞后、应急决策被动迟缓,难以适…...

3步掌握开源硬件性能优化工具:解锁你的设备隐藏潜力 [特殊字符]

3步掌握开源硬件性能优化工具:解锁你的设备隐藏潜力 😊 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuning-Utility …...

Figma中文插件终极指南:3分钟快速安装让设计界面秒变中文

Figma中文插件终极指南:3分钟快速安装让设计界面秒变中文 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma复杂的英文界面而烦恼?Figma中文插件通过精…...

阴阳师百鬼夜行自动化脚本:从入门到精通的完整指南

阴阳师百鬼夜行自动化脚本:从入门到精通的完整指南 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 阴阳师百鬼夜行作为获取式神碎片的重要途径,长期手动操…...

拼多多电商数据采集终极指南:5分钟搭建专业级爬虫系统

拼多多电商数据采集终极指南:5分钟搭建专业级爬虫系统 【免费下载链接】scrapy-pinduoduo 拼多多爬虫,抓取拼多多热销商品信息和评论 项目地址: https://gitcode.com/gh_mirrors/sc/scrapy-pinduoduo scrapy-pinduoduo是一款专为拼多多平台设计的…...

Windows驱动存储管理完整指南:DriverStore Explorer终极使用教程

Windows驱动存储管理完整指南:DriverStore Explorer终极使用教程 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer DriverStore Explorer(又称RAPR)是一…...

ui-audit:UI审查神器,让你的UI更规范,交互更合理

ui-audit:Tommy Geoco 出品,让 AI 替你做 UI/UX 审查当“设计评审”从会议室里的漫长争论,变成了命令行里的一条指令——这就是 ui-audit 试图改变的事情。如果你曾在深夜对着一个按钮的位置反复纠结,或是在设计评审会上因为“感觉…...

Python 爬虫反爬突破:行为轨迹模拟绕过风控检测

前言 随着网络反爬技术持续迭代,传统基于请求头伪造、IP 代理轮换、验证码破解的基础爬虫方案已无法应对高阶站点风控体系。主流平台不再仅校验请求参数、IP 地址与验证码,而是引入用户行为风控模型,通过采集浏览器操作轨迹、鼠标移动路径、…...

【大白话说Java面试题】【Java基础篇】第39题:说说反射的用途及实现原理,Java获取反射(Class)的三种方法

📌 专栏:大白话说Java面试题 — 01-Java基础篇 第39题:说说反射的用途及实现原理,Java获取反射(Class)的三种方法 📚 回答: 什么是反射? Java 的反射机制允许程序在运行…...

Python 爬虫反爬突破:文字验证码 OCR 识别开发

前言 传统英数混合文字验证码是早期网站最基础的人机校验形式,至今仍大量应用于中小型站点、后台管理系统、老旧业务平台的登录及接口防护场景。此类验证码通过字符扭曲、粘连、旋转、噪点填充、干扰线条、彩色渐变背景等方式增加机器识别难度,依靠人工…...

Autovisor终极教程:如何用Python自动化脚本轻松完成智慧树课程学习

Autovisor终极教程:如何用Python自动化脚本轻松完成智慧树课程学习 【免费下载链接】Autovisor 2025智慧树刷课脚本 基于Python Playwright的自动化程序 [有免安装版] 项目地址: https://gitcode.com/gh_mirrors/au/Autovisor 还在为智慧树平台的繁琐学习流程…...

如何让手机分身术?WeChatPad打破微信设备限制的魔法

如何让手机分身术?WeChatPad打破微信设备限制的魔法 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad 想象一下这样的场景:你正在用手机回复工作消息,突然家人发来重要信息。…...

APA 7th Edition多语言引用终极指南:三步解决Word参考文献格式混乱问题

APA 7th Edition多语言引用终极指南:三步解决Word参考文献格式混乱问题 【免费下载链接】APA-7th-Edition Microsoft Word XSD for generating APA 7th edition references 项目地址: https://gitcode.com/gh_mirrors/ap/APA-7th-Edition 还在为APA 7th Edit…...

Windows热键侦探:揭秘全局快捷键冲突的终极解决方案

Windows热键侦探:揭秘全局快捷键冲突的终极解决方案 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾在…...

如何通过自动化脚本实现淘宝任务的高效管理:技术原理与实践指南

如何通过自动化脚本实现淘宝任务的高效管理:技术原理与实践指南 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi …...

Atom编辑器终极中文汉化指南:如何快速实现菜单与界面全面本地化

Atom编辑器终极中文汉化指南:如何快速实现菜单与界面全面本地化 【免费下载链接】atom-simplified-chinese-menu Atom 的简体中文汉化扩展,目前最全的汉化包。包含菜单汉化、右键菜单汉化以及设置汉化 项目地址: https://gitcode.com/gh_mirrors/at/atom-simplifi…...

060、步进电机丢步检测与补偿

060 步进电机丢步检测与补偿:从一次半夜炸机说起 凌晨两点,实验室的示波器上跳出一串诡异的波形。我那台三轴运动平台在跑了第47次循环后,Z轴突然像得了帕金森一样剧烈抖动——丢步了。更操蛋的是,这次丢步没有任何预兆,没有过载报警,没有限位触发,电机就这么悄无声息地…...

PotPlayer字幕翻译插件终极指南:打破语言壁垒的简单方法

PotPlayer字幕翻译插件终极指南:打破语言壁垒的简单方法 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 你是否曾经因为外语…...

使用Hermes Agent框架时如何接入Taotoken作为自定义模型提供商

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Hermes Agent框架时如何接入Taotoken作为自定义模型提供商 Hermes Agent 是一个流行的智能体应用开发框架,它允许开…...

基于ONVIF协议与Python实现AI Agent视觉节点:AI Watcher项目实战

1. 项目概述:让摄像头成为AI的“眼睛”最近在折腾一个挺有意思的项目,叫AI Watcher。简单来说,它的目标是把一个普通的、支持ONVIF协议的监控摄像头,变成一个能被AI智能体(Agent)直接调用的“视觉节点”。这…...

工程师如何高效参与行业会议:从甄选、投稿到价值转化全攻略

1. 行业会议的价值与参与策略:不只是“赶场”在电子设计自动化、半导体和硬件开发这个行当里干了十几年,我越来越觉得,参加行业会议这件事,远不止是去听几场报告、拿个纪念品那么简单。很多人,尤其是刚入行的工程师&am…...

Go语言消息队列事务:Exactly-Once与At-Least-Once语义

Go语言消息队列事务:Exactly-Once与At-Least-Once语义 1. 消息语义 消息队列有三种传递语义:At-Most-Once(最多一次)、At-Least-Once(至少一次)和Exactly-Once(恰好一次)。 type Del…...