Java-易失性和可见性

Java-易失性和可见性,java,multithreading,volatile,Java,Multithreading,Volatile,据我所知,volatile背后的底层机制保证不会对操作进行重新排序。然而,我很难看到它是如何保证可见性的 即线程A写入一个值。然后线程B从内存而不是缓存中读取它(以保证缓存一致性)。我知道CAS正是这样做的,但内存屏障是如何实现这一点的?内存屏障由CPU实现,以始终显示最新的值。如果没有CPU支持,这是无法实现的 这是一个常见的误解,即访问主内存,但这将是非常缓慢的。相反,二级缓存之间存在缓存一致性总线 在一级缓存之前有一个写存储缓冲区,但CPU确保核心之间的缓存线是最新的。Volatile“使

据我所知,volatile背后的底层机制保证不会对操作进行重新排序。然而,我很难看到它是如何保证可见性的


即线程A写入一个值。然后线程B从内存而不是缓存中读取它(以保证缓存一致性)。我知道CAS正是这样做的,但内存屏障是如何实现这一点的?

内存屏障由CPU实现,以始终显示最新的值。如果没有CPU支持,这是无法实现的

这是一个常见的误解,即访问主内存,但这将是非常缓慢的。相反,二级缓存之间存在缓存一致性总线

在一级缓存之前有一个写存储缓冲区,但CPU确保核心之间的缓存线是最新的。

Volatile“使用”特定于硬件的指令来实现它。这是

我知道CAS确实做到了这一点,但mem屏障如何实现这一点

因为如果您在
AtomicInteger
中查看示例,您将看到

private volatile int value;

通用内存屏障是一种特定于CPU的指令,表示“使读缓存无效”或“提交写缓存”,或两者兼而有之。在x86这样的强顺序CPU上,“使读缓存无效”是不可操作的,因为缓存总是一致的。

是的,但是说“它是由CPU实现的,以显示最新的值”对我来说有点太高了。它是如何实现的?存储缓冲区是否被刷新?太过通用且特定于英特尔。@Bober02,您似乎在问一个关于计算机体系结构的问题,这可能超出了本论坛的讨论范围。啊,所以存储缓冲区被刷新到主mem和缓存失效…?是的,加载时缓存“失效”-这就是更改传播的方式,
StoreLoad
barrier。