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

相关推荐
Pniubi7 小时前
怎么排查慢SQL,怎么解决?
java·数据库·sql
薛之谦_8 小时前
Java 全栈知识体系:从 IDEA 高效开发到 JVM、并发与 Stream 实战
java·jvm·intellij-idea
文丑颜不良啊12 小时前
LeetCode2761~2780题目解析
java·leetcode
IT枫斗者枫哥13 小时前
子线程断言失败,JUnit 为什么还显示通过?
java·后端
考虑考虑15 小时前
JDK27中的Set.ofLazy
java·后端·java ee
文丑颜不良啊15 小时前
LeetCode2841~2860题目解析
java·leetcode
小南家的青蛙15 小时前
Tomcat与Jetty深度对比
java·tomcat·jetty
乌暮17 小时前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
YDS82917 小时前
Small Spring IOC篇:容器事件及其监听器
java·spring
金銀銅鐵17 小时前
带您看懂字节码指令(三):一行加法里有什么
java·jvm