简短结论:Java 的 Atomic* 类(如 AtomicInteger、AtomicReference 等)可以解决“单个变量的原子性并发问题”,但不能解决所有并发问题。
下面分点说明。
Atomic 利用 CAS(Compare And Swap) + volatile,保证对单个变量的读—改—写是原子性的。
例如:
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet(); // 原子自增
✅ 解决:
i++内部基于 volatile,保证:
相比 synchronized:
if (count.get() < 10) {
count.incrementAndGet();
}
❌ 这不是原子的!
需要:
while (true) {
int old = count.get();
if (old >= 10) break;
if (count.compareAndSet(old, old + 1)) break;
}
或更直接:
synchronized
AtomicInteger a, b;
a.incrementAndGet();
b.incrementAndGet(); // 两步不保证整体原子
✅ 解决方式:
synchronizedLockAtomicReference例如:
这些 Atomic 做不到,需要:
值从 A → B → A,CAS 认为没变。
解决方案:
AtomicStampedReference
竞争激烈时:
✅ 用 Atomic 的场景:
❌ 不适合:
Atomic 能解决“单个变量的原子并发问题”,但不能替代锁和事务来解决“整体业务一致性问题”。
如果你有具体代码场景,我可以直接告诉你该用 Atomic 还是 synchronized / Lock。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。