volatile 可以不能保证原子性?

volatile 关键字不能保证原子性。它仅能保证可见性禁止指令重排序,但无法确保复合操作的不可分割性(即原子性)。以下是详细分析:

为什么 volatile 无法保证原子性?

  1. 原子性的本质 原子性要求一个操作(如 i++)必须作为一个不可分割的整体执行,中间不能被其他线程中断。但 i++ 实际包含三步:

    • 读取变量当前值(read)

    • 计算新值(i+1

    • 写回新值(write)即使变量是volatile,多个线程仍可能在读与写之间发生干扰,导致数据竞争。

  2. volatile 的作用边界

    • 可见性:确保一个线程修改后,其他线程立即看到最新值(强制主内存读写)。

    • 有序性:通过内存屏障禁止指令重排序(如单例模式的双重检查锁定)。但两者均不涉及操作过程的锁定机制,因此无法阻止多线程同时执行复合操作。

反例:volatile 修饰的计数器

public class VolatileExample {
    private static volatile int count = 0;
​
    public static void main(String[] args) throws InterruptedException {
        Runnable task = () -> {
            for (int i = 0; i < 1000; i++) {
                count++; // 非原子操作!
            }
        };
​
        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);
        t1.start(); t2.start();
        t1.join(); t2.join();
        System.out.println("结果: " + count); // 可能小于 2000
    }
}

原因: 若线程 A 和 B 同时读取 count=10,各自计算 11 后写回,最终结果变为 11 而非预期的 12

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tsxchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值