温馨提示×

温馨提示×

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

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

java Atomic原子性原理是什么

发布时间:2026-10-08 16:41:35 来源:亿速云 阅读:86 作者:小樊 栏目:编程语言

在 Java 中,Atomic 原子类(如 AtomicInteger、AtomicLong、AtomicReference 等) 能够保证原子性操作,其底层核心原理主要依赖两点:


一、什么是“原子性”

原子性指的是:一个操作在执行过程中不会被线程调度机制打断,要么全部执行成功,要么完全不执行,不会出现中间状态被其他线程看到的情况。

例如:

i++  // 非原子操作:读 → 改 → 写

多线程下会出现竞态条件。

而:

atomicInteger.incrementAndGet(); // 原子操作

二、Atomic 原子性的实现原理

1️⃣ 底层依赖:CAS(Compare And Swap)

CAS 是 Atomic 类实现原子性的核心机制。

CAS 的思想

CAS 包含三个操作数:

CAS(V, A, B)
  • V:要更新的变量(内存值)
  • A:预期值(旧值)
  • B:新值

逻辑:

如果 V == A,就把 V 更新为 B;否则什么都不做。

这是一个CPU 级别的原子指令,不会被线程切换打断。


2️⃣ 以 AtomicInteger 为例

源码示意(简化)

public class AtomicInteger {
    private volatile int value;

    public final int incrementAndGet() {
        return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
    }
}

Unsafe 中的实现(核心)

public final int getAndAddInt(Object obj, long offset, int delta) {
    int oldValue;
    do {
        oldValue = getIntVolatile(obj, offset);
    } while (!compareAndSwapInt(obj, offset, oldValue, oldValue + delta));
    return oldValue;
}

执行流程:

  1. 读取当前值 oldValue
  2. 计算新值 oldValue + delta
  3. 使用 CAS 尝试更新
  4. 如果失败(被其他线程改过),自旋重试

3️⃣ volatile 的关键作用

Atomic 类中的变量通常是:

private volatile int value;

volatile 保证:

  • 可见性:一个线程修改,其他线程立即可见
  • 有序性(一定程度)

⚠️ 注意:

volatile 不能保证原子性,但它是 CAS 正确工作的前提。


三、为什么 Atomic 是“无锁”的?

  • 不使用 synchronized
  • 不阻塞线程
  • 通过 自旋 + CAS 实现线程安全

✅ 优点:

  • 性能高(低竞争时)
  • 无死锁风险

❌ 缺点:

  • 高并发下 CAS 自旋开销大
  • 存在 ABA 问题

四、ABA 问题及解决

什么是 ABA 问题?

变量从 A → B → A,CAS 认为“没变”,但实际上已经变过。

解决方案

使用:

AtomicStampedReference
AtomicMarkableReference

通过 版本号 / 标记 解决。


五、Atomic 的常见类

类 说明
AtomicInteger 原子整型
AtomicLong 原子长整型
AtomicBoolean 原子布尔
AtomicReference 原子对象引用
AtomicStampedReference 带版本号
LongAdder 高并发计数优化

六、一句话总结

Java Atomic 原子性的原理是:基于 volatile 保证可见性 + Unsafe 提供的 CAS 指令实现无锁原子操作。

如果你愿意,我也可以从 JVM / CPU 层面 或 和 synchronized 的对比 再深入讲。

向AI问一下细节

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

AI
助
手