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

问答 x843974585 ⋅ 于 2019-06-17 17:31:40 ⋅ 2716 阅读

根据JMM对于volatile变量类型的语义规范:volatile在编译之后,会在变量写操作时添加LOCK前缀指令。这个LOCK前缀指令在多核处理器的环境中,有这样的作用:

通知CPU将当前处理器缓存行的数据写回到系统主存中
该写回操作将使其他CPU缓存了该内存地址的数据无效
这里的一个疑惑是在多线程的情况下,其他CPU缓存失效的情况下,为什么其他线程对volatile的修改还是不能保证原子性?之前线程修改后的数据已经写回到主内存中了,线程切换后缓存失效其他线程不是会重新读主内存的数据到缓存中吗(实际上并没有),而是继续进行修改操作然后写回到主内存,造成线程不安全的情况?在前一个线程已经将volatile变量同步回主内存,然后无效化其他CPU的缓存之后,线程切换到其他线程线程后到底发生了什么?

成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter