首页 > Java > java教程 > 正文

什么是Java中的volatile关键字_volatile在并发中的作用解析

P粉602998670
发布: 2025-12-19 16:38:02
原创
522人浏览过
volatile保证变量可见性和禁止指令重排序,但不保证原子性;每次读写都强制主内存操作,插入内存屏障限制重排序,适用于状态标志等简单场景。

什么是java中的volatile关键字_volatile在并发中的作用解析

volatile 是 Java 中用于修饰变量的关键字,它的核心作用是**保证变量的可见性**,并**禁止指令重排序**,但**不保证原子性**。它不是锁,也不能替代 synchronized 或 Lock,但在特定场景下能以更轻量的方式解决部分并发问题。

volatile 如何保证可见性

在多线程环境下,每个线程可能把变量从主内存读到自己的工作内存(如 CPU 缓存)中操作。若一个线程修改了该变量,其他线程可能看不到最新值——这就是可见性问题。
volatile 修饰的变量,每次读取都强制从主内存读,每次写入都立即刷回主内存,从而让所有线程“看到同一个最新值”。

  • 适用于“一个线程写、多个线程读”的简单状态标志,比如:private volatile boolean running = true;
  • 不能用于需要“读-改-写”复合操作的场景(如 count++),因为 ++ 操作本身不是原子的

volatile 如何禁止指令重排序

编译器和处理器为了优化性能,可能调整语句执行顺序(只要单线程结果不变)。但这种重排序在多线程下可能引发问题。
volatile 变量的读写会插入内存屏障(Memory Barrier),限制其前后指令的重排序范围:

  • 写 volatile 变量前的所有操作,不会被重排到该写之后
  • 读 volatile 变量后的所有操作,不会被重排到该读之前
  • 这个特性常被用于实现“双重检查锁定(DCL)”中的安全对象初始化

volatile 的能力边界:为什么它不保证原子性

可见性和有序性 ≠ 原子性。例如:

立即学习Java免费学习笔记(深入)”;

会译·对照式翻译
会译·对照式翻译

会译是一款AI智能翻译浏览器插件,支持多语种对照式翻译

会译·对照式翻译 97
查看详情 会译·对照式翻译
private volatile int counter = 0;
counter++;

这行代码实际包含三步:读 counter → 加 1 → 写回 counter。volatile 只能确保每一步的读/写操作对其他线程可见,但无法阻止两个线程同时读到相同旧值、各自加 1、再写回,最终只增加了一次。

  • 需要原子性时,应使用 AtomicInteger、synchronized 或显式锁
  • volatile 适合做状态开关、标志位、单次写入后只读的引用(如单例对象的引用)

典型使用场景举例

常见且安全的用法包括:

  • 线程间通信的布尔标志:volatile boolean shutdownRequested;
  • 发布不可变对象的引用(如配置对象):volatile Config currentConfig;
  • 双重检查单例中的实例字段:private static volatile Singleton instance;

不推荐用于计数器、累加器、依赖多个 volatile 变量协同逻辑的场景。

以上就是什么是Java中的volatile关键字_volatile在并发中的作用解析的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号