Java 内存模型 - 易失性和 x86
我试图理解java易失性及其语义的内在,以及它对底层架构及其指令的转换。如果我们考虑以下博客和资源
为易失性生成的栅栏,为栅栏上的易失性和堆栈溢出问题的读/写生成的内容
这是我收集到的:
- 易失性读取在其后插入 loadStore/LoadLoad 屏障(x86 上的 LFENCE 指令)
- 它防止了加载与后续写入/加载的重新排序
- 它应该保证加载由其他线程修改的全局状态,即在LFENCE之后,其他线程完成的状态修改对其CPU上的当前线程可见。
我正在努力理解的是:Java不会在x86上发出LFENCE,即读取易失性不会导致LFENCE.我知道x86的内存排序可以防止使用lods/存储来重新排序负载,因此处理了第二个项目符号点。但是,我假设为了使此线程能够看到状态,应该发出LFENCE指令,以确保在执行围栏后的下一个指令之前,所有LOAD缓冲区都被耗尽(根据英特尔手册)。我知道x86上有cahce一致性协议,但易失性读取仍然应该耗尽缓冲区中的任何LOAD,不是吗?