Java多线程与并发编程:原子操作与CAS陷阱!超市自助结账的智慧(9)

原子操作与CAS陷阱:超市自助结账的智慧



一、原子操作:超市收银的终极方案

1.1 从人工收银到自助结账

传统多线程计数如同人工收银台:

// 人工收银(非原子操作)
public class CashierCounter {
   
    
    
    private int count = 0;
    
    public void increment() {
   
    
    
        int temp = count; // 查看当前金额
        temp += 1;       // 计算新金额
        count = temp;    // 更新金额(可能被覆盖)
    }
}

问题分析:当两个收银员同时操作时:

  1. 收银员A读到count=100
  2. 收银员B也读到count=100
  3. 两人都计算得到101
  4. 最终结果错误地变成101而非102

1.2 自助结账机原理(CAS)

现代原子操作如同自助结账设备:

AtomicInteger atomicCount = new AtomicInteger(0);

public void safeIncrement() {
   
    
    
    int prev, next;
    do {
   
    
    
        prev = atomicCount.get(); // 读取当前值
        next = prev + 1;          // 计算新值
    } while (!