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

相关推荐
南城以南溫暖如初1477 分钟前
分享返现商城系统开发实战:技术架构与运营经验指南
java·spring boot·mysql·架构·vue·mybatis
vipxieliang29 分钟前
Java切面编程(AOP)详解:从核心概念到实战应用
java·spring boot
.Hypocritical.1 小时前
SpringBoot 各版本 Profile 多环境配置完整对比(2.x/ 2.4+ / 3.x/4.x
java·spring boot·后端
露天赏雪1 小时前
掘金小册样章
java·开发语言·人工智能·ai编程
zlwool1 小时前
图纸管理选型:从变更频率到齐套率
java·前端·python·erp·设备erp·非标机械
码场老菜鸟1 小时前
C++ 指针的深度理解与应用
java·c++·算法
霸道流氓气质1 小时前
Spring AI Function Calling实现原理与自定义函数
java·spring·microsoft
OPEN-F1 小时前
C++并发编程:条件变量与原子操作
java·开发语言·c++
南城以南溫暖如初1472 小时前
社群电商实战指南:从零搭建高转化社区的技术架构
java·spring boot·mysql·系统架构·vue·mybatis
南城以南溫暖如初1472 小时前
会员返利商城系统开发实战:架构设计与实现指南
java·spring boot·mysql·vue·mybatis