繁体   English   中英

Java - 易变性和可见性

[英]Java - volatile and visibility

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

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

易失性“使用”硬件特定指令来实现它。 这是关于JSR-133和编译器编写器的内存障碍的深入文章

我知道CAS确实如此,但是如何实现这一目标?

因为如果你在AtomicInteger寻找例子,你会看到

private volatile int value;

内存屏障由CPU实现,以始终显示最新值。 没有CPU支持就无法实现这一点。

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

在L1高速缓存之前有一个写入存储缓冲区,但CPU确保高速缓存行在核心之间是当前的。

通用内存屏障是特定于CPU的指令,它表示“使读取缓存无效”或“提交写入缓存”,或两者兼而有之。 在像x86这样的强排序CPU上,“使读取缓存无效”是一种无操作,因为缓存始终是连贯的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM