單執行緒計算結果穩定,多執行緒並行計算同一資料結果波動。
i++ 非原子操作:讀取 → 加一 → 寫回 三步驟。多執行緒交錯執行導致更新丟失。
| 方案 | 適用場景 | 範例 |
|---|---|---|
synchronized | 方法/區塊級鎖,簡單通用 | synchronized(lock){ i++; } |
ReentrantLock | 需公平鎖、可中斷、條件變數 | lock.lock(); try{ i++; }finally{ lock.unlock(); } |
AtomicInteger | 計數器、單一變數無鎖 | AtomicInteger i = new AtomicInteger(); i.incrementAndGet(); |
ThreadLocal | 執行緒私有副本,最後彙總 | ThreadLocal |
java.util.concurrent.atomic 無鎖類別。final、String、Guava ImmutableList。