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

相关推荐
cngkqy8 小时前
NoClassDefFoundError: org/apache/poi/logging/PoiLogManager
java
l1o3v1e4ding8 小时前
Java网站项目集成GO-FLY开源在线客服系统功能,集成IM即时通信
java·golang·开源
m0_651593918 小时前
领域驱动设计(DDD)实战指南:如何正确构建复杂系统
java·软件工程·ddd
nbwenren8 小时前
linux 设置tomcat开机启动
java
Y4090018 小时前
【多线程】Thread 类
java·开发语言·jvm
东离与糖宝9 小时前
Spring AI Alibaba v1.0 正式版:Java 企业 AI 网关从 0 到 1 搭建
java·人工智能
学java的冲鸭9 小时前
【SpringAI第四章】函数调用
java·ai·springai
极创信息9 小时前
企业信创产品认证全流程:从信创适配到信创认证的实操指南(2026版)
java·数据库·spring boot·mysql·matlab·mybatis·软件工程
onebound_noah9 小时前
【实战解析】如何高效获取京东商品详情数据(含多语言SDK接入)
java·前端·数据库
重庆小透明9 小时前
【java基础内容】ArrayList与LinkedList的区别及ArrayList源码解析
java·开发语言·后端·面试·职场和发展