volatile为什么不能保证原子性?

青小梅 2019-06-17 12:50:13
根据JMM对于volatile变量类型的语义规范:volatile在编译之后,会在变量写操作时添加LOCK前缀指令。这个LOCK前缀指令在多核处理器的环境中,有这样的作用:
通知CPU将当前处理器缓存行的数据写回到系统主存中
该写回操作将使其他CPU缓存了该内存地址的数据无效

这里的一个疑惑是在多线程的情况下,其他CPU缓存失效的情况下,为什么其他线程对volatile的修改还是不能保证原子性?之前线程修改后的数据已经写回到主内存中了,线程切换后缓存失效其他线程不是会重新读主内存的数据到缓存中吗(实际上并没有),而是继续进行修改操作然后写回到主内存,造成线程不安全的情况?在前一个线程已经将volatile变量同步回主内存,然后无效化其他CPU的缓存之后,线程切换到其他线程线程后到底发生了什么?
...全文
79 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

51,409

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧