温馨提示×

温馨提示×

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

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

为何java Atomic具备原子性

发布时间:2026-10-08 18:31:36 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

一句话概括:Java 的 Atomic 类之所以具备原子性,是因为它们底层依赖 CPU 的原子指令(如 CAS / 锁总线 / 内存屏障),并由 JVM 和硬件共同保证“读—改—写”操作不可被打断。

下面分层说明。


1. Atomic 是什么

以 AtomicInteger 为例:

AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();

表面上只是一个 count++,但它是原子操作,不会出现在多线程下读到旧值、写丢更新的问题。


2. 核心机制:CAS(Compare And Swap)

CAS 原理

CAS 是一种CPU 级别的原子指令,逻辑是:

if (当前值 == 期望值)
    更新为新值
else
    不做任何事

Java 中的 Unsafe 类会直接调用 CPU 指令,例如:

  • x86:LOCK CMPXCHG
  • ARM:LDREX / STREX

Atomic 的伪代码

public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}
  • 如果多个线程同时改
  • 只有一个线程 CAS 成功
  • 失败的线程重试

✅ 整个“读—改—写”过程在硬件层面是原子的


3. 为什么普通 i++ 不行?

i++;

实际是三步:

  1. 读 i
  2. 计算 i+1
  3. 写回 i

线程可能被打断,导致:

线程A读 i=1
线程B读 i=1
线程A写 i=2
线程B写 i=2  // 少加一次

Atomic 用 CAS 避免了这个问题。


4. 硬件层面如何保证原子性?

方式一:锁总线(早期 CPU)

LOCK 前缀 + 指令
  • 锁定内存总线
  • 其他 CPU 无法访问该内存

方式二:缓存一致性协议(现代 CPU)

  • MESI 协议
  • 只锁缓存行(Cache Line)
  • 性能更好

✅ 这些机制由 CPU + JVM + OS 共同保证


5. volatile + Atomic 的关系

volatile 保证:

  • 可见性
  • 禁止指令重排

但 volatile 不保证:

  • 复合操作原子性(如 i++)

Atomic = volatile + CAS

private volatile int value;

6. 为什么 Atomic 比 synchronized 快?

对比项 synchronized Atomic
是否阻塞 是 否(自旋)
锁粒度 线程级 变量级
适用场景 复杂逻辑 简单计数/状态

⚠️ 高并发下 CAS 自旋过多也会损耗 CPU


7. 总结一句话

Java Atomic 的原子性不是“Java 语言”给的,而是 Unsafe + CAS + CPU 原子指令共同实现的。

如果你愿意,我也可以:

  • 对比 Atomic vs synchronized
  • 讲 LongAdder 为什么更快
  • 看源码级 CAS 调用链路
向AI问一下细节

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

AI
助
手