← 返回并发与锁

🏃 竞态条件

为什么并发会出错 —— count++ 不是原子操作,中间会被打断

📊 竞态条件时序图(count++ 为例)
时间 线程 A 读 count=5 算 5+1=6 写 count=6 线程 B 读 count=5 算 5+1=6 写 count=6 ❌ 两次 ++ 应该是 7,实际是 6(丢失更新)
// ❌ 非原子,并发不安全 public int count = 0; public void incr() { count++; // = 读count → +1 → 写count,三步,中间会被打断 } // ✅ 方案1:synchronized 加锁 public synchronized void incr() { count++; } // ✅ 方案2:AtomicInteger(CAS 无锁) AtomicInteger count = new AtomicInteger(0); count.incrementAndGet(); // 原子操作
本质:count++ 看似一行代码,在 CPU 层是"读-改-写"三条指令,线程切换可能发生在任意两条指令之间。这就是竞态条件
解法:加锁(串行化)/ CAS(原子操作)/ 不共享(ThreadLocal)。
并发与锁 · 竞态条件 · 全栈资料库