volatile为什么无法保证原子性

假设定义 volatile int i =0;

现在2个线程同时 i++,为什么数据还可能会出错?一起来看下图,虽然volatile的机制是:如果volatile修饰的变量有修改,那么会将变更内容写回主内存,同时让其他线程工作内存的该变量缓存过期。但是这对原子性有什么用吗?请看下图的volatile的回写流程,这个流程就能看明白为啥不能保证原子性了。

当线程1执行了i++,目前i=1了,如果再通知线程2,让其工作内存的缓存过期有用吗?没用啊,因为线程2也早就计算出来了i=1,也准备写回内存里,线程2写回主内存的也是1。这个问题的关键点在于:线程1、2同时加载了i=0,然后同时完成了运算i++,计算出i=1,然后这个往回写的过程,和原子性无关。

那这计算了2次i++,最后主内存=1,数据肯定有问题的。

相关推荐
Jul1en_14 小时前
【Java 脚手架】封装通用工具类-1
java·spring boot·分布式·spring·spring cloud
关于不上作者榜就原神启动那件事15 小时前
从 MDC 到 Agent:我手搓的文档路由协议,在 Spring AI Alibaba 里找到了正式实现
java·人工智能·spring·ai·agent
亦暖筑序15 小时前
重新认识 AgentScope-Java 2.0:ReActAgent 负责推理,HarnessAgent 负责运行
java·后端·agent
木井巳15 小时前
【DFS解决floodfill算法】岛屿的最大面积
java·算法·leetcode·深度优先
运维大师16 小时前
【K8S 运维实战】34-多集群管理Karmada
java·运维·kubernetes
林森lsjs16 小时前
完结撒花!Java SE 语法阶段总结!
java·开发语言
lupai16 小时前
短信接口快速接入与调用实战指南
java·开发语言·数据库
ltqvibe16 小时前
企业智能问数落地:从一句话到跨系统完整答案
java·人工智能·本体语义平台
会编程的吕洞宾16 小时前
Spring Boot 虚拟线程实战:从原理到生产环境
java·后端·spring
黑桃小柒716 小时前
Prompt 工程的“断舍离“:如何用更少的词让 AI Agent 更聪明
java·后端·spring