首页 文章

Java内存模型 - volatile和x86

提问于
浏览
14

我试图理解java volatile的内在函数及其语义,以及它对底层架构及其指令的转换 . 如果我们考虑以下博客和资源

fences generated for volatileWhat gets generated for read/write of volatileStack overflow question on fences

这是我收集的内容:

  • volatile read在它之后插入loadStore / LoadLoad障碍(x86上的LFENCE指令)

  • 它可以防止随后的写入/加载重新排序负载

  • It is supposed to guarantee loading of the global state that was modified by other threads 即在LFENCE之后,其他线程完成的状态修改对其CPU上的当前线程可见 .

我正在努力理解的是: Java does not emit LFENCE on x86 i.e. read of volatile does not cause LFENCE ....我知道x86的内存排序会阻止对lods / stored的加载进行重写,因此第二个要点得到了解决 . 但是,我假设为了使该状态可以被该线程看到,应该发出LFENCE指令以保证在执行栅栏后的下一条指令之前所有LOAD缓冲区都被耗尽(根据英特尔手册) . 我知道x86上有cahce coherence协议,但是volatile读取仍然会消耗缓冲区中的任何LOAD,不是吗?

1 回答

  • 5

    在x86上,缓冲区固定到缓存行 . 如果缓存行丢失,则不使用缓冲区中的值 . 所以没有必要围栏或排出缓冲区;它们包含的值必须是最新的,因为在没有首先使高速缓存行无效的情况下,另一个核心无法修改数据 .

相关问题