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