据我所知,volatile背后的潜在机制保证不会重新排序操作。但是我很难看到它如何保证可见性。
即。线程 A 写入一个值。然后线程 B 从内存中读取它,而不是从缓存中读取它(以保证缓存一致性)。我知道CAS正是这样做的,但是记忆障碍如何实现呢?
答案 0 :(得分:2)
易失性“使用”硬件特定指令来实现它。这是in-depth article about JSR-133 and Memory Barriers for Compiler Writers
我知道CAS确实如此,但是如何实现这一目标?
因为如果您在AtomicInteger
内查找示例,您会看到
private volatile int value;
答案 1 :(得分:1)
内存屏障由CPU实现,以始终显示最新值。没有CPU支持就无法实现这一目标。
一种常见的误解是访问是主内存,但这会非常慢。相反,L2缓存之间有一个缓存一致性总线。
在L1缓存之前有一个写存储缓冲区,但CPU确保缓存线在核心之间是当前的。
答案 2 :(得分:0)
通用内存屏障是特定于CPU的指令,它表示“使读取缓存无效”或“提交写入缓存”,或两者兼而有之。在像x86这样强排序的CPU上,“使读取缓存无效”是一种无操作,因为缓存始终是连贯的。