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

不中断就能保证原子性?大错特错!

如果读者您对“原子性”的认知单纯只是一组操作要么连续做完,要么不做的话,那么说明您不是真的懂原子性,这篇文章值得您一读。

很多人(包括笔者自己)在刚接触并发领域时,通常会把“连续性”等同于“原子性”,认为对于一系列的操作,只要这一系列操作能直接执行完,在此期间不被打断,这一系列操作就是原子性的。其实这种看法是错误的。这种情况只能说明这一系列操作具有“连续性”,而不具备“原子性”真正的原子性在具备连续性的同时,还应该具有“不可窥探性”。

“原子性的最终保障必须来自硬件,软件只能借助硬件原语来封装和扩展原子性边界”
在软件层面讨论原子性是没有意义的,要讨论原子性, 我们必须把目光下放到硬件层面。那么硬件是怎么实现原子性的? 让我们走进CPU内部,看看真正的原子性实现

剖析 CPU 的原语看 CPU 怎么实现原子性

一. 连续性的实现:

在 CPU 的芯片外壳上通常有几根物理引脚是用来接受中断信号的,外部设备想中断 CPU 就给这根引脚发送一个高电平信号。CPU 内部有一个控制节点,它决定了中断是否能被响应,这个控制节点就是一个“与门”,有两个输入端:一个是中断引脚信号,另一个是中断屏蔽位。输出端为触发中断处理信号。

当 CPU 执行原子操作时,将中断屏蔽位置为 0,在整个原子操作执行完后再置为 1。这就保证在整个过程中,CPU 都不会响应外部中断,直到原子操作结束。

二. 不可窥探性的实现:

先来看一段Java代码

public class TestAtomic { private static AtomicInteger count = new AtomicInteger(0); public static void main(String[] args) { // !!! java的原子操作最终是由CPU的原子操作保障的 for (int i = 0; i < 100000; i++) { count.incrementAndGet(); } System.out.println("Final count: " + count.get()); } }

其汇编后的核心代码

可以看到,CPU 核心在执行原子性操作时会给指令加上“lock”前缀。

该前缀会触发“缓存行锁定”(若数据跨缓存行则退化为锁总线)。通过 MESI 协议,该核心将对应缓存行标记为ModifiedExclusive状态,同时强制其他核心中对应的缓存行立即失效。在操作完成前,其他核心若尝试读取该数据,其请求会被“总线嗅探”机制拦截并等待,直到当前核心完成写入并结束锁定状态。这种机制确保了外界无法拿到正在被原子性修改的“中间态”数据。

原子性的权威定义为“全有或全无”,无中间态、无部分执行;
聪明的您应该想到了,真正的原子性不仅要依靠不被中断来实现“全有或全无,无部分执行”的连续性,还需要“互斥性”来实现“无中间态”的不可窥探,如果外界要访问一个正在被原子操作修改的值, 那么应该等待这个原子操作结束!很多人也喜欢把原子性当成互斥性来看待,其实这是不准确的,严格来说互斥性只是实现原子不可窥探性的一种手段。


结语:如果这篇文章能给读者您带来一些启发和思考,笔者将不胜荣幸。最后,笔者有个问题想留给各位,许多编程语言都宣称其锁机制能保障操作的“原子性”,您认为这种“原子性”是真正的“原子性”吗?欢迎在评论区分享你的观点。

http://www.jsqmd.com/news/536931/

相关文章:

  • GTE-large多任务NLP效果惊艳展示:事件抽取与问答系统真实输出集
  • Windows系统OpenClaw完整安装部署保姆级教程(官方推荐+3种安装方式+全流程避坑指南)
  • Phi-4-Reasoning-Vision企业应用:与RAG系统集成实现文档图像知识增强推理
  • OpenClaw隐私保护方案:nanobot镜像本地化部署的3大优势
  • 漫画脸描述生成实战案例:为独立游戏开发团队生成10个NPC角色设定
  • OpenClaw插件开发入门:为Qwen3-32B镜像编写天气查询技能
  • Pixel Dream Workshop 自动化测试集成:为UI界面生成海量测试用例配图
  • PYTHON_DAY07_容器入门和字符串详解
  • ANIMATEDIFF PRO环境配置:Flask后端+HTML5前端本地调试全流程
  • PP-DocLayoutV3高算力适配:FP16推理开启后显存降低30%,精度损失<0.5%
  • 【2026 最新】Java JDK 17 安装配置详细全攻略 带图展示
  • 基于遗传算法的LQR控制器优化设计sumlink仿真模型探索
  • Keycloak 完全使用指南:从零开始理解与应用
  • STM32模拟UART实现技术详解
  • Windows系统OpenClaw安装全流程配置详解(从初始化到进阶优化,新手零踩坑)
  • 电路设计中的常用速算
  • 5、线性代数之特征值、矩阵相似(知识总结)
  • 仅剩72小时!主流边缘芯片厂商即将停更Python模型导入工具链——现在必须掌握的3种离线转换保底方案
  • TCP三次握手与四次挥手详解含图解
  • 百川2-13B-4bits模型压缩对比:OpenClaw任务场景下的显存与速度权衡
  • linux基础学习三
  • YOLO X Layout实战:从扫描PDF中自动提取标题与表格的Python实现
  • Hunyuan-MT-7B低资源语言支持展示:东南亚小语种(老挝、缅甸、高棉)实测
  • Qwen3.5开源模型实测
  • 智能客服原型:OpenClaw接入Qwen3.5-9B处理电商常见问答
  • 从零开始:DeepWiki-Open 开源AI维基生成器完全部署指南
  • Anomalib使用
  • 阿里蚂蚁Kimi连夜换引擎!混合注意力炸场,456B模型200万token秒吞,API直接打2折
  • ESLint代码规范(一)
  • SkeyeVSS中国标GB28181、流媒体源RTMP/RTSP/HTTP/ONVIF、RTMP推流等协议视频流实时播放流程详解