在 Java 中,Atomic(原子性)通常指的是 java.util.concurrent.atomic 包下提供的一组原子类,以及它们所体现的原子性特征。
下面从概念、原理、常见类和示例几个方面说明。
**原子性(Atomicity)**指的是:
一个操作在执行过程中,要么全部完成,要么完全不发生,不会被线程调度机制打断。
在多线程环境中,如果没有原子性保证,就可能出现竞态条件(Race Condition)。
例如:
count++; // 看似一行,实际是 读-改-写 三步
在并发下,多个线程可能同时读到相同的 count,导致结果错误。
Java 提供了 java.util.concurrent.atomic 包,用来在不使用锁的情况下保证原子操作。
| 类 | 说明 |
|---|---|
AtomicInteger |
原子整型 |
AtomicLong |
原子长整型 |
AtomicBoolean |
原子布尔 |
AtomicReference |
原子对象引用 |
AtomicIntegerArray |
原子整型数组 |
AtomicStampedReference |
带版本号的原子引用(解决 ABA 问题) |
Atomic 类底层依赖 CAS 机制:
CAS(内存地址, 期望值, 新值)
示例(简化逻辑):
while (true) {
int old = value;
int next = old + 1;
if (compareAndSet(old, next)) {
break;
}
}
CAS 通常由 CPU 指令(如 x86 的 cmpxchg)支持,效率高于 synchronized。
import java.util.concurrent.atomic.AtomicInteger;
public class Demo {
private static AtomicInteger count = new AtomicInteger(0);
public static void main(String[] args) throws InterruptedException {
Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
count.incrementAndGet(); // 原子自增
}
};
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(count.get()); // 2000
}
}
✅ 结果始终正确,不会因为并发而出错。
| 对比项 | Atomic | synchronized |
|---|---|---|
| 粒度 | 变量级 | 代码块 / 方法 |
| 是否阻塞 | 否(自旋) | 是(阻塞) |
| 性能 | 高 | 相对较低 |
| 适用场景 | 简单计数、状态标志 | 复杂业务操作 |
Java 的 Atomic 原子性特征,是通过 CAS 机制在无锁情况下,保证单个变量的读-改-写操作不可中断、线程安全。
如果你愿意,我也可以讲:
volatile 的区别免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。