讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java中volatile关键字的作用是什么_Java内存可见性解析

冬芳君_4020

冬芳君_4020

发布时间:2026-01-28 14:03:08

|

679人浏览过

|

来源于php中文网

原创

volatile不能保证原子性。它仅确保变量的内存可见性和禁止指令重排序,但“读-改-写”操作(如counter++)非原子,多线程下会丢失更新;复合逻辑必须加锁或用并发工具类。

在java中volatile关键字的作用是什么_java内存可见性解析

volatile 能不能保证原子性

不能。volatile 只保证变量的内存可见性和禁止指令重排序,不提供原子性保障。比如对 volatile int counter = 0 执行 counter++,这个操作包含“读取-修改-写入”三步,在多线程下仍可能丢失更新。

常见错误现象:多个线程循环执行 counter++ 1000 次,最终 counter 值远小于 2000。

  • 用 AtomicInteger 替代普通 int 可解决该问题
  • 若涉及复合逻辑(如“先判断再赋值”),volatile 无能为力,必须加锁或使用 java.util.concurrent 工具类
  • volatile 对 long 和 double 的读写是原子的(JVM 规范保证),但仅限于单次读或单次写

volatile 如何解决内存可见性问题

Java 线程有自己的工作内存(如 CPU cache),可能缓存共享变量副本。volatile 强制每次读都从主内存加载,每次写都立即刷回主内存,从而让所有线程看到最新值。

典型使用场景:状态标志位、初始化完成通知、轻量级线程间通信。

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

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
public class VolatileExample {
    private volatile boolean isReady = false;
    private int data = 0;

    public void prepare() {
        data = 42;                    // 普通写
        isReady = true;                // volatile 写 → 刷出 data 和 isReady
    }

    public void use() {
        if (isReady) {                // volatile 读 → 保证能看到 data == 42
            System.out.println(data);
        }
    }
}

注意:volatile 写之前的所有普通写,对后续 volatile 读之后的代码“可见”,这是由 happens-before 规则保证的,不是靠刷新整个缓存。

volatile 和 synchronized 的关键区别

两者都涉及内存语义,但机制和开销不同:

  • synchronized 保证原子性 + 可见性 + 有序性,进入/退出时有内存屏障,且会阻塞线程
  • volatile 仅保证可见性 + 有序性(禁止重排序),无锁、无阻塞,性能更好但能力更弱
  • 当变量仅被单个线程写、多个线程读(如配置开关),volatile 是更优选择
  • 一旦出现“读-改-写”逻辑(哪怕只是 +=),就必须放弃 volatile,改用同步机制

哪些情况 volatile 会失效

最常被忽略的是:对象引用本身是 volatile,不代表其内部字段自动可见。

public class BadExample {
    private volatile MyConfig config; // ✅ 引用可见

    public void update() {
        config = new MyConfig();       // ✅ 新引用写入主内存
    }

    public void read() {
        config.flag = true;          // ❌ flag 字段非 volatile,修改不保证其他线程立即看到
    }
}

其他失效场景:

  • 在 final 字段初始化完成后,再通过反射修改它 —— volatile 不起作用
  • 与 Unsafe 直接内存操作混用时,JVM 不保证语义一致性
  • 跨 JVM 进程(如分布式系统)中,volatile 完全无效,需用 Redis、ZooKeeper 等外部协调

真正理解 volatile,关键是盯住“谁的内存”“什么时候刷”“对谁可见”——它只管那个变量本身的读写动作,不多也不少。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

1973

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

2874

2023.10.07

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5879

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2905

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3668

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2585

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3668

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

684

2025.10.23

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

0

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn