当前位置: 首页 > 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.rkmt.cn/news/1384043.html

相关文章:

  • AhMyth反射调用:动态加载与执行代码的技术解析
  • 3分钟快速上手:终极ncmdump工具实现NCM转MP3的完整指南
  • 057电话号码的字母组合
  • 测试工程师常用的python库
  • D2DX:让《暗黑破坏神2》在现代PC上焕发新生的终极方案
  • 告别手动测试!VtestStudio结合CAPL脚本实现自动化测试的保姆级教程
  • Universal-Updater性能优化技巧:3DS内存受限环境下的高效编程
  • 开源工业控制器的终极实战指南:如何用OpenPLC替代传统PLC实现高效自动化
  • SpliceAI:深度学习剪接变异预测的终极指南
  • 基于XGBoost预测与优化分簇的6G无人机网络性能提升
  • 优质电商独立站 跨境电商海外b2b2c独立站系统推荐
  • 基于ESP32的宽频主动式RFID信号探测仪设计与实现
  • GB/T 44464-2024正式实施:汽车数据安全新国标逐条解读,车企合规需要做什么?
  • Claude Code用户如何配置Taotoken解决密钥被封与Token不足难题
  • 如何快速解锁艾尔登法环帧率限制:终极性能优化指南
  • AI Agent 面试题 957:Computer Use Agent的原理和实现方案
  • LayerPlayer扩展开发:如何添加自定义CALayer子类
  • 深度解析HS2-HF Patch:从技术框架到创作工具链的完整升级方案
  • BiliRoamingX:彻底解决B站体验限制的完整增强方案
  • 【2026最新图文教程】Git下载安装、全配置详解|从零配置到运行,新手小白快速上手
  • WarcraftHelper终极指南:深度解析魔兽争霸III现代化兼容性解决方案
  • Graphin高级应用:结合GISDK构建配置化图分析模块的完整指南
  • Wireshark解密SSH流量实战:获取会话密钥四步法
  • CTF流量分析实战:从以太网帧到TLS握手的多层穿透方法
  • AI Agent 面试题 958:LangChain框架的核心架构和设计理念详解
  • 几何操作与语义操作映射边界:自指认知几何学的形式化体系(世毫九实验室原创研究)
  • 蓝桥杯软件测试备考:用Python+Selenium搞定Web自动化那些高频考点(附完整代码)
  • 宁波梅雨季来临,房屋漏水抓紧修!2026最新房屋漏水维修公司TOP5调研盘点!卫生间免砸砖防水、楼顶外墙、阳光房+地下室渗漏解决方案解析 - 防水百科
  • 基于ESP32与Telegram Bot的物联网互动设备开发实战
  • AI Agent 面试题 956:Agent操作系统的网络通信和服务发现