在 Java 中,Atomic 原子类(如 AtomicInteger、AtomicLong、AtomicReference 等)的“原子性”并不是通过 synchronized 锁来实现的,而是依赖底层硬件和 JVM 提供的 CAS(Compare And Swap,比较并交换)机制。
下面从 原理 → 实现 → 示例 → 注意事项 详细说明。
CAS 是一种 无锁(lock-free) 的原子操作,包含三个操作数:
CAS(内存地址 V, 期望值 A, 新值 B)
逻辑是:
整个过程是 CPU 级别的原子指令,不会被线程切换打断。
Java 的 Atomic 类最终调用的是:
Unsafe.compareAndSwapInt / compareAndSwapLong / compareAndSwapObject
这些方法:
sun.misc.Unsafe 提供cmpxchg 指令以 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;
}
}
value 使用 volatile
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;
}
vv + delta这就是 原子性的来源。
| 操作 | 是否原子 |
|---|---|
i++(普通 int) |
❌ 非原子(读-改-写) |
synchronized |
✅ 原子(加锁) |
AtomicInteger.incrementAndGet() |
✅ 原子(CAS) |
Atomic 之所以线程安全:
| 类 | 用途 |
|---|---|
AtomicInteger |
原子整数 |
AtomicLong |
原子长整型 |
AtomicBoolean |
原子布尔 |
AtomicReference |
原子对象引用 |
AtomicStampedReference |
解决 ABA 问题 |
LongAdder |
高并发计数(分段 CAS) |
✅ 解决:
AtomicStampedReference<T>
通过版本号解决。
✅ 解决:
LongAdderAtomicReference 包装对象synchronizedJava 的 Atomic 原子性是通过 volatile + Unsafe + CAS(CPU 原子指令)实现的,是一种无锁的线程安全机制。
如果你愿意,我也可以:
synchronized vs AtomicLongAdder 为什么更快免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。