gpt4 book ai didi

Java 内存模型 - volatile 和 x86

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:30 24 4
gpt4 key购买 nike

我正在尝试了解 java volatile 的内在特性及其语义,以及它到底层架构及其指令的转换。如果我们考虑以下博客和资源

fences generated for volatile , What gets generated for read/write of volatileStack overflow question on fences

这是我收集的:

  • volatile 读取在其后插入 loadStore/LoadLoad 屏障(x86 上的 LFENCE 指令)
  • 它可以防止对后续写入/加载的加载进行重新排序
  • 它应该保证加载由其他线程修改的全局状态,即在 LFENCE 之后,其他线程所做的状态修改对其 CPU 上的当前线程可见。

我很难理解的是:Java does not emit LFENCE on x86 即读取 volatile 不会导致 LFENCE.... 我知道 x86 的内存排序会阻止使用 lods/stored 对负载进行重新排序,因此第二个要点得到了处理。但是,我假设为了让该线程看到状态,应该发出 LFENCE 指令以保证在执行栅栏后的下一条指令之前耗尽所有 LOAD 缓冲区(根据 Intel 手册)。我知道 x86 上有 cahce 一致性协议(protocol),但 volatile 读取仍应耗尽缓冲区中的所有负载,不是吗?

最佳答案

在 x86 上,缓冲区被固定到缓存行。如果缓存行丢失,则不会使用缓冲区中的值。因此无需围栏或耗尽缓冲区;它们包含的值必须是当前值,因为另一个核心在不首先使缓存行无效的情况下无法修改数据。

关于Java 内存模型 - volatile 和 x86,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43668251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com