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

相关推荐
8***f3956 分钟前
Spring容器初始化扩展点:ApplicationContextInitializer
java·后端·spring
r_oo_ki_e_12 分钟前
java22--常用类
java·开发语言
linweidong23 分钟前
C++ 中避免悬挂引用的企业策略有哪些?
java·jvm·c++
用户937611475816125 分钟前
并发编程三大特性
java·后端
阿在在26 分钟前
Spring 系列(二):加载 BeanDefinition 的几种方式
java·后端·spring
小当家.10534 分钟前
Maven与Gradle完整对比指南:构建工具深度解析
java·gradle·maven
neoooo41 分钟前
🍃Spring Boot 多模块项目中 Parent / BOM / Starter 的正确分工
java·后端·架构
黄金贼贼42 分钟前
2026最新java单元测试json校验器
java·单元测试·json
菜鸟的迷茫42 分钟前
为了防雪崩加了限流,结果入口先挂了
java·后端·架构
荒诞硬汉44 分钟前
数组常见算法
java·数据结构·算法