首页 > Java > java教程 > 正文

java volatile的特性是什么

冰川箭仙
发布: 2025-12-08 11:26:02
原创
908人浏览过
Java volatile核心特性是保证可见性、禁止指令重排序、不保证原子性;它通过强制主内存读写和内存屏障实现可见性与有序性,但无法保证复合操作的原子性。

java volatile的特性是什么

Java volatile 关键字的核心特性就三个:保证可见性、禁止指令重排序、不保证原子性。它不是万能锁,而是一种轻量级的内存语义控制机制,专为解决特定并发问题设计。

保证可见性

一个线程修改了 volatile 变量的值,其他线程能立即看到这个新值。这是因为:

  • 每次读 volatile 变量,都强制从主内存加载最新值,不使用工作内存中的旧缓存;
  • 每次写 volatile 变量,都强制把新值刷新回主内存,不延迟同步;
  • 底层依赖 MESI 协议和总线嗅探,让其他 CPU 缓存中对应缓存行失效,确保后续读取必须重新加载。

典型场景:用 volatile 布尔标志位(如 stop = true)通知其他线程退出循环,避免因缓存不一致导致的死循环。

禁止指令重排序

编译器和 CPU 为了性能优化,可能调整语句执行顺序,但 volatile 会插入内存屏障(Memory Barrier),约束重排序行为:

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

佐罗电子商务系统改进版
佐罗电子商务系统改进版

主页面上引用了三个页面也说不过去呀。本次主要是把数据库合并了一下,至于功能,没有加什么新的东西,还是那些:在线订购、帐单查询(添加了一个打印的连接)、特价商品列表、热买商品列表、留言本(许多朋友说以前的那个有问题,现在换成枫叶阁女士留言本,挺不错的)、新闻、完善的管理

佐罗电子商务系统改进版 3
查看详情 佐罗电子商务系统改进版
  • volatile 写操作前的所有读写,不能被重排到该写之后;
  • volatile 读操作后的所有读写,不能被重排到该读之前;
  • 这提供了“先行发生”(happens-before)关系:一个线程对 volatile 变量的写,对另一个线程对该变量的读可见,且写之前的所有内存操作也对读线程可见。

典型用途:单例模式中的双重检查锁定(DCL),用 volatile 修饰 instance 字段,防止对象尚未构造完成就被其他线程使用。

不保证原子性

volatile 不能替代 synchronized 或 AtomicInteger 来做复合操作:

  • 对 volatile 变量的单次读或单次写是原子的(比如 flag = trueint x = count);
  • 但像 count++ 这种操作包含“读-改-写”三步,volatile 无法保证整个过程不可中断;
  • 多个线程同时执行 count++,结果很可能小于预期,必须配合锁或原子类。

简单说:volatile 管“看得到”和“不乱序”,不管“能不能一起做完”。

基本上就这些。

以上就是java volatile的特性是什么的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

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

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