在 Java 中,Atomic 原子类(如 AtomicInteger、AtomicLong、AtomicReference 等) 能够保证原子性操作,其底层核心原理主要依赖两点:
原子性指的是:一个操作在执行过程中不会被线程调度机制打断,要么全部执行成功,要么完全不执行,不会出现中间状态被其他线程看到的情况。
例如:
i++ // 非原子操作:读 → 改 → 写
多线程下会出现竞态条件。
而:
atomicInteger.incrementAndGet(); // 原子操作
CAS 是 Atomic 类实现原子性的核心机制。
CAS 包含三个操作数:
CAS(V, A, B)
逻辑:
如果 V == A,就把 V 更新为 B;否则什么都不做。
这是一个CPU 级别的原子指令,不会被线程切换打断。
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;
}
执行流程:
oldValueoldValue + deltavolatile 的关键作用Atomic 类中的变量通常是:
private volatile int value;
volatile 保证:
⚠️ 注意:
volatile 不能保证原子性,但它是 CAS 正确工作的前提。
synchronized✅ 优点:
❌ 缺点:
变量从 A → B → A,CAS 认为“没变”,但实际上已经变过。
使用:
AtomicStampedReference
AtomicMarkableReference
通过 版本号 / 标记 解决。
| 类 | 说明 |
|---|---|
AtomicInteger |
原子整型 |
AtomicLong |
原子长整型 |
AtomicBoolean |
原子布尔 |
AtomicReference |
原子对象引用 |
AtomicStampedReference |
带版本号 |
LongAdder |
高并发计数优化 |
Java Atomic 原子性的原理是:基于 volatile 保证可见性 + Unsafe 提供的 CAS 指令实现无锁原子操作。
如果你愿意,我也可以从 JVM / CPU 层面 或 和 synchronized 的对比 再深入讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。