Java内存模型 - volatile和x86

Bob*_*r02 14 java cpu multithreading volatile java-memory-model

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

为volatile生成的fences,在fence上读取/写入volatileStack overflow问题时会生成什么

这是我收集的内容:

  • volatile read在它之后插入loadStore/LoadLoad障碍(x86上的LFENCE指令)
  • 它可以防止随后的写入/加载重新排序负载
  • 它应该保证加载由其他线程修改的全局状态,即在LFENCE之后,由其他线程完成的状态修改对其CPU上的当前线程是可见的.

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

Dav*_*rtz 5

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

  • 对,就是这样.缓冲区固定到缓存行.如果高速缓存行无效,则高速缓存读取也是如此.因此,虽然x86执行预取读取,但它不能使用过时的值.(当然,这只是x86的东西.) (2认同)