当读取 volatile 变量时,缓存/寄存器数据被刷新并直接从 RAM(主存储器)读取 - 这称为读取屏障。
Qs 谁执行上述任务,JVM 还是 OS?
这些缓存/寄存器是堆栈/堆的一部分?
还有一个问题:
堆由 JVM 管理(由操作系统管理)?
Java 堆栈由操作系统管理(而不是由 JMV)?
当然,如何做到这一点取决于机器的硬件。在某些机器上,它也可能依赖于操作系统。但我相信如今所有常见的处理器都有可用于用户模式代码的指令,这些指令可用于实现内存一致性;操作系统不需要参与。
对于比我能解释得更好的血腥细节,请参阅The JSR-133 Cookbook for Compiler Writers中的“内存屏障”部分。
值得澄清的是,所需的操作(通常)实际上不是刷新到主存储器或从主存储器读取。确保所有处理器内核的缓存彼此一致就足够了,即使它们尚未与主内存一致。这通常更容易实现。
JVM 负责实现语言规范(包括定义 volatile 变量如何工作的内存模型)。
顾名思义,JVM 是一个将实际环境(OS/cpu)抽象出来的虚拟环境,因此开发人员无需关心程序在哪里运行即可编写正确的代码。
实际上,JVM 在 OS/cpu 上运行,并使用 OS/cpu 的适当命令来执行程序,例如通过发出内存屏障。