首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

多線程共享資料導致結果不穩定?必須加入同步機制保護關鍵區段

     編輯:程式設計疑難解答

現象

單執行緒計算結果穩定,多執行緒並行計算同一資料結果波動。

根因

i++ 非原子操作:讀取 → 加一 → 寫回 三步驟。多執行緒交錯執行導致更新丟失。

解決方案

方案適用場景範例
synchronized方法/區塊級鎖,簡單通用synchronized(lock){ i++; }
ReentrantLock需公平鎖、可中斷、條件變數lock.lock(); try{ i++; }finally{ lock.unlock(); }
AtomicInteger計數器、單一變數無鎖AtomicInteger i = new AtomicInteger(); i.incrementAndGet();
ThreadLocal執行緒私有副本,最後彙總ThreadLocal tl = ThreadLocal.withInitial(() -> 0);

最佳實踐

  • 優先使用 java.util.concurrent.atomic 無鎖類別。
  • 鎖粒度越小越好,避免在同步區塊呼叫耗時 IO。
  • 不可變物件天生線程安全,多用 final、String、Guava ImmutableList。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved