volatile保证可见性靠内存屏障、禁止重排序和强制刷新缓存协同实现,写操作立即刷回主内存并使其他缓存失效,读操作强制从主内存加载最新值,但不保证复合操作原子性。

volatile 保证可见性的核心,不是靠锁或阻塞,而是通过内存屏障(Memory Barrier)+ 禁止指令重排序 + 强制刷新缓存三者协同实现的。
当一个线程对volatile变量执行写操作时,JVM会插入一个StoreStore屏障(写-写屏障),确保该写操作之前的所有普通写操作都已提交到主内存;紧接着插入一个StoreLoad屏障,强制将当前线程工作内存中该volatile变量的最新值立即写入主内存,并使其他CPU缓存中该变量的副本失效。
当一个线程读取volatile变量时,JVM会插入一个LoadLoad屏障(读-读屏障),再插入一个LoadStore屏障,确保该读操作之后的普通读/写不会被重排到它前面;更重要的是,它禁止使用寄存器或本地缓存中的旧值,必须从主内存(或通过MESI协议获取最新值)重新读取。
可见性 ≠ 原子性。比如volatile int count = 0;,执行count++实际分三步:读count、加1、写回count。虽然每一步的读和写都可见,但中间可能被其他线程打断——两个线程同时读到0,各自加1后都写回1,结果丢失一次更新。
立即学习“Java免费学习笔记(深入)”;
适合状态标志、一次性安全发布、双重检查锁中的实例引用等无需复合操作、仅需状态通知的场合。
基本上就这些。volatile的可见性是JMM在硬件层与编译器层共同保障的结果,理解它关键在于抓住“写即刷出、读必重载、禁止重排”这三点,而不是把它当成轻量级锁来用。
以上就是在Java中volatile如何保证可见性_Java volatile内存语义解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号