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

相关推荐
摘星编程30 分钟前
解锁Agent智能体的未来:五大实战策略彻底革新人机协作模式
java·开发语言
百块富翁31 分钟前
可管控、不重复TraceId解决方案
java·分布式·系统架构
金銀銅鐵35 分钟前
浅解 Junit 4 第二篇: Runner 和 ParentRunner
java·junit·单元测试
_codemonster1 小时前
JavaWeb开发系列(七)表单开发
java
黎潇lulu1 小时前
Java运算符基础知识
java·开发语言
HAPPY酷1 小时前
C++中类常见的函数分类
java·开发语言·c++
小钻风33661 小时前
JWT初识
java·jwt·base64url
weixin_449173652 小时前
java使用poi保存表格和图片到word文件中
java·开发语言·word