原子操作与CAS陷阱:超市自助结账的智慧
文章目录
一、原子操作:超市收银的终极方案
1.1 从人工收银到自助结账
传统多线程计数如同人工收银台:
// 人工收银(非原子操作)
public class CashierCounter {
private int count = 0;
public void increment() {
int temp = count; // 查看当前金额
temp += 1; // 计算新金额
count = temp; // 更新金额(可能被覆盖)
}
}
问题分析:当两个收银员同时操作时:
- 收银员A读到count=100
- 收银员B也读到count=100
- 两人都计算得到101
- 最终结果错误地变成101而非102
1.2 自助结账机原理(CAS)
现代原子操作如同自助结账设备:
AtomicInteger atomicCount = new AtomicInteger(0);
public void safeIncrement() {
int prev, next;
do {
prev = atomicCount.get(); // 读取当前值
next = prev + 1; // 计算新值
} while (!