温馨提示×

温馨提示×

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

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

java Atomic原子性怎么实现

发布时间:2026-10-30 16:19:52 来源:亿速云 阅读:93 作者:小樊 栏目:编程语言

在 Java 中,Atomic 原子类(如 AtomicInteger、AtomicLong、AtomicReference 等)的“原子性”并不是通过 synchronized 锁来实现的,而是依赖底层硬件和 JVM 提供的 CAS(Compare And Swap,比较并交换)机制。

下面从 原理 → 实现 → 示例 → 注意事项 详细说明。


一、Atomic 原子性的核心原理:CAS

1. 什么是 CAS

CAS 是一种 无锁(lock-free) 的原子操作,包含三个操作数:

CAS(内存地址 V, 期望值 A, 新值 B)

逻辑是:

  • 如果 当前内存值 == 期望值 A
    • 就把内存值改成 B
    • 返回成功
  • 否则
    • 不做修改
    • 返回失败

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


2. Java 中 CAS 的底层支持

Java 的 Atomic 类最终调用的是:

Unsafe.compareAndSwapInt / compareAndSwapLong / compareAndSwapObject

这些方法:

  • 由 sun.misc.Unsafe 提供
  • 在 x86 上通常对应 cmpxchg 指令
  • 由 CPU 保证原子性

二、AtomicInteger 是如何实现的(源码角度)

以 AtomicInteger 为例:

public class AtomicInteger extends Number implements java.io.Serializable {
    private volatile int value;

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

关键点

  1. value 使用 volatile
    • 保证可见性
  2. 实际自增逻辑在 Unsafe 中:
public final int getAndAddInt(Object o, long offset, int delta) {
    int v;
    do {
        v = getIntVolatile(o, offset);
    } while (!compareAndSwapInt(o, offset, v, v + delta));
    return v;
}

执行流程

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

这就是 原子性的来源。


三、为什么 Atomic 是“原子”的?

操作 是否原子
i++(普通 int) ❌ 非原子(读-改-写)
synchronized ✅ 原子(加锁)
AtomicInteger.incrementAndGet() ✅ 原子(CAS)

Atomic 之所以线程安全:

  • CAS 保证更新操作不可中断
  • volatile 保证值对其他线程可见

四、常见 Atomic 类及用途

类 用途
AtomicInteger 原子整数
AtomicLong 原子长整型
AtomicBoolean 原子布尔
AtomicReference 原子对象引用
AtomicStampedReference 解决 ABA 问题
LongAdder 高并发计数(分段 CAS)

五、CAS 的问题与解决

1. ABA 问题

  • 值从 A → B → A
  • CAS 认为没变,其实变过

✅ 解决:

AtomicStampedReference<T>

通过版本号解决。


2. 自旋开销

  • 高并发下可能频繁重试

✅ 解决:

  • LongAdder
  • 减少竞争(分段)

3. 只能保证一个变量原子

  • 多变量原子性需要:
    • AtomicReference 包装对象
    • 或 synchronized

六、总结一句话

Java 的 Atomic 原子性是通过 volatile + Unsafe + CAS(CPU 原子指令)实现的,是一种无锁的线程安全机制。

如果你愿意,我也可以:

  • 画 CAS 执行流程图
  • 对比 synchronized vs Atomic
  • 讲 LongAdder 为什么更快
  • 结合并发场景选型建议
向AI问一下细节

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

AI
助
手