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,数据肯定有问题的。

相关推荐
jiayong2313 小时前
第 43 课:任务详情抽屉里的批量处理闭环与删除联动
java·开发语言·前端
likerhood13 小时前
Java 访问修饰符:public、protected、private讲解
java·开发语言·javascript
Ting-yu13 小时前
SpringCloud快速入门(5)---- 均衡负载
java·spring·spring cloud
学不思则罔13 小时前
ParallelStream并发陷阱解析
java·开发语言·windows
认真的小羽❅13 小时前
【Java并发编程】volatile关键字深度解析:从内存语义到实际应用
java·开发语言
奋斗的小乌龟14 小时前
langchain4j笔记-08
java·spring boot·笔记
leonidZhao14 小时前
Java25新特性:加密对象的PEM编码
java
计算机安禾14 小时前
【c++面向对象编程】第21篇:运算符重载基础:语法、规则与不可重载的运算符
java·前端·c++
萧曵 丶14 小时前
JUC 实际业务高频面试题浅谈
java·juc·aqs·lock