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

相关推荐
刘梦凡呀40 分钟前
C#获取钉钉平台考勤记录
java·c#·钉钉
best_virtuoso1 小时前
PostgreSQL 常见数组操作函数语法、功能
java·数据结构·postgresql
yudiandian20141 小时前
02 Oracle JDK 下载及配置(解压缩版)
java·开发语言
楚韵天工2 小时前
宠物服务平台(程序+文档)
java·网络·数据库·spring cloud·编辑器·intellij-idea·宠物
helloworddm2 小时前
Orleans Stream SubscriptionId 生成机制详解
java·系统架构·c#
失散132 小时前
分布式专题——43 ElasticSearch概述
java·分布式·elasticsearch·架构
ajsbxi2 小时前
【Java 基础】核心知识点梳理
java·开发语言·笔记
聪明的笨猪猪2 小时前
Java JVM “调优” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
重整旗鼓~2 小时前
28.redisson源码分析分布式锁
java·开发语言
Query*2 小时前
Java 设计模式——工厂模式:从原理到实战的系统指南
java·python·设计模式