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

相关推荐
一只专注api接口开发的技术猿几秒前
微服务架构下集成淘宝商品 API 的实践与思考
java·大数据·开发语言·数据库·微服务·架构
2501_9444241211 分钟前
Flutter for OpenHarmony游戏集合App实战之记忆翻牌配对消除
android·java·开发语言·javascript·windows·flutter·游戏
鹿角片ljp18 分钟前
Java网络编程入门:从Socket到多线程服务器
java·服务器·网络
走进IT26 分钟前
DDD项目分层结构说明
java
橙露31 分钟前
嵌入式实时操作系统 FreeRTOS:任务调度与信号量的核心应用
java·大数据·服务器
愚公移码31 分钟前
蓝凌EKP产品:关联机制浅析
java·服务器·前端
阿蒙Amon38 分钟前
C#每日面试题-is和as的区别
java·开发语言·c#
Tao____39 分钟前
适合中小企业的物联网平台
java·物联网·mqtt·低代码·开源
迷路剑客1 小时前
ES-7.10-高亮HighLight知识点总结
java·数据库·mybatis
阿蒙Amon1 小时前
C#每日面试题-简述泛型约束
java·开发语言·c#