登录/注册

volatile

更多

好的!volatile 是一个在编程中(尤其在 Java、C、C++ 等语言中)使用的关键字,主要用于解决多线程环境下变量的可见性问题。它的核心含义是告诉编译器和处理器:这个变量是“易变的”,它的值可能在任何时候被程序本身之外的实体(比如其他线程或硬件)意外改变,因此不要对这个变量的访问做激进的优化。

以下是 volatile 关键字的要点和用途的中文解释:

  1. 保证可见性(Visibility):

    • 这是 volatile 最主要的作用。
    • 多线程程序中,每个线程通常都有自己的工作内存(缓存),它会从主内存中拷贝变量的副本进行操作。
    • 如果没有 volatile,一个线程修改了某个共享变量的值,可能只是写回到它自己的工作内存,而不会立即写回主内存。同样,其他线程在读取这个变量时,可能直接从它自己的(过期的)工作内存副本中读取,看不到最新的修改值
    • volatile 修饰的变量强制要求:
      • 写操作: 当线程修改一个 volatile 变量的值时,修改会立即被写回主内存
      • 读操作: 当线程读取一个 volatile 变量的值时,它会直接去主内存读取最新的值,而不是使用工作内存中的缓存副本。
    • 这样,一个线程对 volatile 变量的修改,对其他线程就是立即可见的。
  2. 禁止指令重排(Prevents Reordering):

    • 编译器和处理器为了优化性能,可能会对指令的执行顺序进行重排(Reordering)。
    • volatile 修饰的变量会创建一个内存屏障(Memory Barrier),确保:
      • volatile 操作之前的所有操作(无论普通读写),都必须在写操作之前完成,并且其结果对其他线程可见(即刷新到主内存)。
      • volatile 操作之后的所有操作(无论普通读写),都必须在读操作之后才能开始。
      • 禁止将对 volatile 变量的读写操作与其他内存操作进行重排。
    • 这有助于保证程序执行的顺序性符合代码的逻辑顺序,避免因重排导致的意外结果(尤其是在双重检查锁定等复杂场景中)。
  3. volatile 不能保证原子性(Not Atomic):

    • 这是非常重要的限制!volatile 不能替代 synchronizedjava.util.concurrent.atomic 包中的原子类。
    • volatile 只保证了单个读或写操作的原子性和可见性(例如,读取或写入一个 long/double 变量本身在大多数平台上可能是非原子的,但 volatile 保证了它们的原子读写)。
    • 对于复合操作(例如,i++,它包含 读取当前值 -> 加1 -> 写回新值 三个步骤),volatile 无法保证整个操作的原子性。多个线程同时执行 i++ 仍然可能导致竞态条件(Race Condition)和结果不正确。
    • 如果需要保证复合操作的原子性,必须使用同步(synchronized)原子变量(如 AtomicInteger

volatile 的典型使用场景:

总结关键点 (volatile 能做什么 & 不能做什么):

特性 volatile 能做到吗? 说明
可见性 确保一个线程对变量的修改对其他线程立即可见。
单个读/写的原子性 (对于基本类型) 保证对变量本身的读或写操作是原子的(如读/写 int, boolean, 引用等)。
禁止指令重排 通过内存屏障限制编译器和处理器的优化重排。
复合操作的原子性 不能 i++check-then-act 等包含多个步骤的操作需要额外的同步机制。
互斥访问(锁) 不能 不具备锁的功能,不能保证临界区代码的排他性执行。

简单来说:

volatile 就是告诉系统和优化器:“别缓存这个变量!读它的时候直接去主内存拿最新的,写它的时候马上刷回主内存!也别乱动它周围指令的顺序!” 它解决了其他线程看不到最新值的问题,但解决不了多个线程同时修改同一个变量导致的冲突问题(原子性问题)。

希望这个用中文解释的 volatile 对你有帮助!

什么是‍‍volatile

volatile是一个类型修饰符(type specifier)。 volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

2025-11-25 06:36:14

volatile的原理

今天来了解一下面试题:你对 volatile 了解多少。要了解 volatile 关键字,就得从 Java 内存模型开始。最后到 volatile

2023-10-10 16:33:42

介绍下volatile的底层原理

线程安全的三大特性,原子性、可见性、有序性,这三大特性与我们之前整理的内容息息相关。本篇重点介绍下volatile的底层原理,帮助我们更好的理解java并发包。

2023-06-09 16:17:12

单片机编程关键字之volatile

volatile 修饰的变量是说这变量可能会被意想不到地改变。通常对于程序员而言,单片机 中用的就算常见了volatile 是易变的,不稳定的意思。其实对于很多人来说,根本没见过这个关键字,不 知道

资料下载 松山归人 2025-04-02 13:47:01

C环境中的VOLATILE关键字

volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这 个变量的时候,都会直接从变量地址中读取数据。如果没有 volatile 关键字,则编译器可能

资料下载 哈哈哈 2022-06-14 15:03:53

Volatile关键字在嵌入式开发中的应用

前言在进行嵌入式开发中,我们往往会看到一个名为volatile或者__IO的关键字,那么,它们对于嵌入式开发有什么作用呢?浅析volatile数据类型实际上,__IO和

资料下载 佚名 2021-11-02 18:21:02

【嵌入式】C语言中volatile关键字

00. 目录文章目录00. 目录01. volatile概述02. volatile应用场景03. volatile应用示例04. 嵌入式系统中

资料下载 李勇 2021-10-21 10:21:04

volatile有哪些使用误区

在建立编译环境的时候用typedef定义了指向volatile 单元的指针,最后终于发现行不通。

资料下载 张磊 2019-08-06 17:34:00

volatile的实现原理分析

`volatile`是一个轻量级的`synchronized`,一般作用于 **变量** ,在多处理器开发的过程中保证了内存的可见性。相比于`synchronized`关键字,`volatile`关键字的执行成本更低

2023-05-11 17:33:35

C语言中的volatile是什么

学C语言时有一个奇怪的关键字volatile,这到底有什么用呢?

2023-02-17 14:29:05

什么是volatile

00. 目录文章目录00. 目录01. volatile概述02. volatile应用场景03. volatile应用示例04. 嵌入式系统中

2021-10-28 09:23:21

C++基础语法之volatile、assert()和sizeof()

volatile volatile int i = 10; volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知

2021-09-09 09:48:29

如何使用C++语法中的volatile

volatile volatile int i = 10; volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知

2021-09-09 09:38:17

一般什么时候需要使用volatile关键字

想必大家平时都见过volatile关键字,可是大家知道什么时候需要使用volatile关键字吗?

2020-12-24 17:29:45

关于volatile关键字对编译器优化的影响

volatile关键字对编译器优化的影响

2020-02-28 17:15:06

7天热门专题 换一换
相关标签