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

相关推荐
用户3126874877208 分钟前
别再 Thread.sleep 硬等了!并发工具类到底怎么选?
java
Java内核笔记10 分钟前
万字长文剖析 Spring Boot 4 自动配置机制源码:从 @EnableAutoConfiguration 到条件装配
java·后端
evans在进步14 分钟前
Spring MVC 核心机制详解:全局异常处理、请求跳转与数据绑定
java·spring·mvc
weixin_BYSJ198726 分钟前
springboot小区物业管理小程序---附源码45555
java·javascript·spring boot·python·django·flask·php
coder_lorraine37 分钟前
Halo 2.x 回收站文章无法删除?一篇文章教你彻底解决
java·运维
索隆zoro40 分钟前
Army 进阶:DML 操作体系与 Spring AI 集成
java
吃饱了得干活1 小时前
为什么你的Service越写越臃肿?三层架构的“业务逻辑层”是个黑盒
java·后端·架构
趴下吧1 小时前
spring boot启动流程总结
java·spring boot·spring
码农进化录1 小时前
Java 程序员的 AI 进化论 | AI 帮我做 MySQL 表结构升级,三天活变半天
java·spring boot·openai
三言老师1 小时前
K8s集群运行时异常趋势分析预警实操
java·开发语言·kubernetes