← 返回并发与锁
🏃 竞态条件
为什么并发会出错 —— count++ 不是原子操作,中间会被打断
📊 竞态条件时序图(count++ 为例)
// ❌ 非原子,并发不安全
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)。
并发与锁 · 竞态条件 · 全栈资料库