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

一文看清:“臭名昭著“ 的双检查锁

“臭名昭著“ 的双检查锁

双检查锁,即锁前检查一次,锁后检查一次。进而避免了无脑上锁对运行时候的性能损耗。

有朋友可能对双检查锁的逻辑有疑惑或不解,我们可以做两个假设:

  1. 假设取消第一个 if 判断
    这就变成了上文提到的无脑上锁的情况
  2. 假设取消第二个 if 判断
    这又变成了上面单线程版本中,可能多次进入最外层 if 的情况

因此这两次检查都是必不可少的。

// 双检查锁的最初版本 static Singleton* instance() { if (nullptr == s_instancePtr) { std::lock_guard<std::mutex> lock(s_mutex); if (nullptr == s_instancePtr) { s_instancePtr = new Singleton(); } } return s_instancePtr; }

到了这里,我们的问题都解决了吗?答案是并非解决,甚至仍有巨大隐患。

具体原因需要往更深层次去探讨。我们脱离代码层面,考虑 CPU 的指令层次会出现一个问题指令重排 reorder

简单分析下::operator new();这个操作,new 的理想状态下可以分为三个步骤:

①. 申请内存

②. 执行构造器

③. 给调用方返回地址

但是在实际的中,经过了指令重排可能会出现 ①③② 这种排列。一旦出现了这种情况,可能会对程序造成不可估计的后果。

能解决这种问题吗?很抱歉,这已经不是普通程序员能涉及的层面了,需要各个语言标准和编译器方来处理。

注意:这不是单门语言的问题,而是属于计算机底层的问题,任何语言都会出现该问题。
http://www.jsqmd.com/news/886047/

相关文章:

  • AhMyth反射调用:动态加载与执行代码的技术解析
  • HarmonyOS 6学习:解决图片放大后无法移动至边缘的matrix4矩阵变换技巧
  • ComfyUI-Manager完整指南:如何轻松管理你的AI工作流扩展库
  • 测试工程师常用的python库
  • 为OpenClaw智能体工作流配置Taotoken作为统一的模型供应商
  • 为什么你的Petalinux装不上?盘点Ubuntu 18.04环境那些必须提前搞定的依赖库(附完整apt命令清单)
  • 如何在3分钟内为任何活动搭建专业级滚动抽奖系统?Magpie-LuckyDraw全平台开源方案深度解析
  • 构建Orin校准数据集的关键策略
  • Matlab,plot绘图如何添加边框
  • Graphin高级应用:结合GISDK构建配置化图分析模块的完整指南
  • 基于AVR单片机的智能MPPT太阳能控制器设计与实现
  • 如何快速解锁各大音乐平台的加密音频文件:终极浏览器解决方案
  • Windows服务器双因素认证部署避坑指南:AD域+OTP令牌5步上线,附故障排查手册
  • 基于ESP32与Telegram Bot的物联网互动设备开发实战
  • WarcraftHelper终极指南:深度解析魔兽争霸III现代化兼容性解决方案
  • 【数据结构与算法】数据结构基础——栈和队列
  • 免费抓包工具选型指南:Wireshark、Fiddler、mitmproxy、Charles实战对比
  • GB/T 44464-2024正式实施:汽车数据安全新国标逐条解读,车企合规需要做什么?
  • DS4Windows终极指南:3步让PS手柄在PC上完美运行游戏
  • D3KeyHelper终极指南:5步打造你的暗黑3自动化战斗系统
  • 创业团队如何利用Taotoken实现低成本多模型AI能力快速验证
  • AI Agent 面试题 957:Computer Use Agent的原理和实现方案
  • 小学期第十一周学习笔记
  • INT8量化下TVA注意力对齐精度保障方案
  • 2026年5月烟台装修市场进入旺季,选烟台装修公司怕踩雷的推荐收藏 - 寻茫精选
  • Performance-Fish:让你的《环世界》后期游戏帧率提升400%的终极优化方案
  • OpenIPC开源固件:5分钟解锁网络摄像头的终极控制权
  • 2026年空气能行业品牌图景正式公开! 纽恩泰全球市场地位解析 - 资讯快报
  • 脉冲神经网络加速器设计与边缘计算优化
  • 【Java EE】IP协议