Java - 易变性和可见性

时间:2016-02-19 10:06:05

标签: java multithreading volatile

据我所知,volatile背后的潜在机制保证不会重新排序操作。但是我很难看到它如何保证可见性。

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

3 个答案:

答案 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上,“使读取缓存无效”是一种无操作,因为缓存始终是连贯的。