温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

volatile对线程安全吗

发布时间:2026-10-29 14:13:05 来源:亿速云 阅读:99 作者:小樊 栏目:编程语言

简单回答:volatile 不保证线程安全,它只解决可见性和禁止指令重排序,不保证原子性。

下面分点说明。


1. volatile 能做什么

✅ 保证可见性

一个线程修改了 volatile 变量,其他线程立刻能看到最新值。

volatile boolean flag = false;

// 线程A
flag = true;

// 线程B
while (!flag) {
    // 不会一直读旧值
}

✅ 禁止指令重排序

常用于**双重检查锁(DCL)**的单例模式。

private static volatile Singleton instance;

public static Singleton getInstance() {
    if (instance == null) {
        synchronized (Singleton.class) {
            if (instance == null) {
                instance = new Singleton();
            }
        }
    }
    return instance;
}

2. volatile 不能做什么

❌ 不保证原子性

典型反例:i++

volatile int i = 0;

// 多线程执行
i++; // 非原子操作

i++ 实际是:

  1. 读 i
  2. 加 1
  3. 写回 i

多个线程可能同时读到相同值,导致丢失更新。


3. 什么时候 volatile 是“线程安全”的?

只有在以下场景才是安全的:

✅ 单个变量的读写是原子的(如 boolean、int 赋值)
✅ 不依赖当前值做复合操作

例如:

volatile boolean stopped = false;

void stop() {
    stopped = true; // 安全
}

4. 正确的线程安全替代方案

场景 正确方式
计数器 AtomicInteger
复合操作 synchronized / Lock
高并发累加 LongAdder
状态标志 volatile(够用)

结论一句话

volatile ≠ 线程安全
它只保证“看得见”,不保证“算得对”。

如果你是准备面试或想看具体并发场景分析,我可以继续展开。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手