这个问题专门关于JVM和内存可见性保证
假设我有一个线程t1
,该线程访问堆上一个x
的变量
假设线程计划在内核c1
中执行,并且已经修改了寄存器中的x
(从RAM中提取),并且x
必须移出寄存器,因为{{ 1}}需要执行更多的指令,这些指令需要将其他数据加载到寄存器中。因此实际上t1
位于x
的缓存中,而不是寄存器中
现在,操作系统将另一个线程c1
调度到t2
中,因此cpu寄存器中充满了新数据,但是我们仍然在缓存中具有c1
的容量(实际上,我表示可能未将缓存刷新到RAM / L3。这是我的假设,不确定是否确实如此)
一段时间后,操作系统将原始x
线程调度到新的核心t1
上,仍然需要c2
来查看{{1}中t1
的最新值}在所有情况下都缓存?
如果x
中的c1
在t1
中看不到最新的c2
,我相信我们将违反JMM的顺序一致性
我错了吗?
PS:我已经阅读了另一个讨论相同/相似问题的主题,但是并没有解决我满意的问题。所以在这里重新发布
答案 0 :(得分:1)
不必担心与缓存相关的不一致。 JMM向您隐藏所有特定于硬件的内存模型详细信息。因此坚持下去并从JMM的角度避免竞争条件就足够了。
如果您担心如此低的细节,那么在x86的情况下,您可能需要阅读Intel手册Vol 3A,第8章:
这些多处理机制具有以下特点 特点:
[...]
•维护高速缓存一致性—当一个处理器访问时 数据缓存在另一个处理器上,它一定不能 接收不正确的数据。如果它修改数据,则所有其他处理器 访问该数据必须接收修改后的数据。
[...]
这应该足以令人信服,因此至少不必担心x86上的缓存不一致:)