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

相关推荐
2601_961194021 分钟前
2026初级会计实务公式总结大全|计算题公式手册PDF
java·spring·eclipse·pdf·tomcat·hibernate
做个文艺程序员6 分钟前
第1篇:K8s 核心概念精讲:Pod、Deployment、Service 与 Namespace——Java 开发者快速上手指南
java·云原生·容器·kubernetes·容器编排
小欣加油2 小时前
leetcode3751 范围内总波动值I
java·数据结构·c++·算法·leetcode
闪电悠米3 小时前
黑马点评-Redisson-01_why_redisson
java·服务器·网络·数据库·缓存·wpf
星轨zb3 小时前
LangChain4j 集成 Spring Boot:会话记忆 NPE 的根源与 ChatMemoryProvider 正确配置
java·spring boot·后端·langchain4j
JAVA9653 小时前
JAVA面试-并发篇 05-并发包AQS队列实现原理是什么
java·开发语言·面试
JAVA面经实录9173 小时前
RocketMQ全套学习知识手册
java·kafka·rabbitmq·rocketmq
phltxy3 小时前
Spring AI 从提示词到多模态
java·人工智能·spring
Halo_tjn3 小时前
反射与设计模式1
java·开发语言·算法
神仙别闹4 小时前
基于Python + SQL server 实现(GUI)原神圣遗物管理与角色数值模拟系统
java·数据库·python