在 Java 中,Atomic(原子性)通常和 java.util.concurrent.atomic 包以及多线程并发安全有关。可以从“什么是原子性”“为什么需要 Atomic”“Atomic 是怎么做到的”“常见类与使用场景”几个层面来理解。
**原子性(Atomicity)**指的是:
一个操作要么全部执行成功,要么完全不执行,不会被线程调度机制打断。
在并发场景中,原子性意味着:
i++;
表面上是一行代码,实际上包含三步:
如果多个线程同时执行,可能会出现:
在多线程中,如果只用:
volatile int count = 0;
volatile 只能保证可见性,不能保证原子性。
所以要解决“计数、状态更新”这类问题,有两种方式:
synchronized(this) {
count++;
}
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();
Atomic 类底层依赖 CAS(Compare And Swap,比较并交换)
期望值 == 当前值 ?
是 → 更新为新值
否 → 重试
以 AtomicInteger.incrementAndGet() 为例:
oldnew = old + 1这是一种自旋 + 无锁的机制。
AtomicInteger
AtomicLong
AtomicBoolean
常用方法:
get()
set()
incrementAndGet()
decrementAndGet()
compareAndSet(expect, update)
AtomicReference<T>
用于原子更新对象引用。
AtomicIntegerArray
对数组中的元素进行原子操作。
AtomicIntegerFieldUpdater
对普通类的 volatile 字段做原子更新(较少用)。
LongAdder
DoubleAdder
在高并发计数场景下,比 AtomicLong 性能更好。
不一定。
例如:
if (atomicA.get() > 0) {
atomicB.incrementAndGet();
}
这两步不是原子操作。
| 特性 | Atomic | synchronized |
|---|---|---|
| 是否加锁 | 否(CAS) | 是 |
| 性能 | 高 | 较低 |
| 适用场景 | 单一变量 | 代码块/多变量 |
| 是否阻塞 | 否 | 可能阻塞 |
Java 的 Atomic 原子性,是通过 CAS 机制,在无锁的情况下,保证单个变量的读-改-写操作不会被线程打断。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。