【发布时间】:2017-04-27 21:31:27
【问题描述】:
我正在尝试理解 java volatile 的内在特性及其语义,以及它对底层架构及其指令的转换。如果我们考虑以下博客和资源
fences generated for volatile、What gets generated for read/write of volatile 和 Stack overflow question on fences
这是我收集的:
- volatile read 在其后插入 loadStore/LoadLoad 屏障(x86 上的 LFENCE 指令)
- 它可以防止在后续写入/加载时重新排序加载
- 它应该保证加载由其他线程修改的全局状态,即在 LFENCE 之后,其他线程所做的状态修改对其 CPU 上的当前线程是可见的。
我很难理解的是:Java 在 x86 上不会发出 LFENCE 即读取 volatile 不会导致 LFENCE.... 我知道 x86 的内存排序会阻止重新排序加载的 lods/stored,因此要处理第二个要点。但是,我假设为了使该线程可见状态,应该发出 LFENCE 指令以保证在执行栅栏后的下一条指令之前耗尽所有 LOAD 缓冲区(根据英特尔手册)。我知道 x86 上有 cahce 一致性协议,但是 volatile 读取仍然应该耗尽缓冲区中的任何负载,不是吗?
【问题讨论】:
-
您似乎忘记了 Java 是独立于平台的。
-
@JacobG.:平台无关与否,Java 实现不是平台无关的,我们仍然可以询问有关 Java 实现如何表现的问题。
标签: java multithreading cpu volatile java-memory-model