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

Java 線程不安全導致的數據競爭問題分析

     編輯:程式設計綜合問答

什麼是線程不安全?

當多個線程同時訪問共享變量且至少一個線程進行寫入操作時,若不採取同步措施,就會發生數據競爭,導致程序結果與預期不符,這就是線程不安全。

經典案例:非原子操作導致計數丟失

假設堆上有一個共享變量 int a = 100,兩個線程並發執行遞增邏輯:

// 線程 1 和 線程 2 同時執行
int c = a;      // 讀取共享變量
c = c + 1;      // 本地計算
a = c;          // 寫回共享變量(相當於 a++)

預期結果

兩個線程各執行一次,a 應從 100 變為 102。

實際可能發生的錯誤過程

  1. 線程 1 讀取 a=100 到 c,計算 c=101
  2. 線程 2 讀取 a=100 到 c,計算 c=101(此時線程 1 尚未寫回)
  3. 線程 1 寫回 a=101
  4. 線程 2 寫回 a=101(覆蓋了線程 1 的結果)

最終結果:a = 101,丟失了一次遞增!

根本原因

a++ 看似一條語句,實際編譯為「讀取-修改-寫入」三步操作,非原子性。多線程交替執行這三步時,會相互覆蓋結果。

常見解決方案

  • synchronized 關鍵字:鎖定共享資源,保證原子性
  • AtomicInteger 等原子類:利用 CAS 機制實現無鎖線程安全
  • volatile + CAS 循環:手動實現樂觀鎖
  • ThreadLocal:避免共享,各線程擁有獨立副本

總結

線程不安全的核心是複合操作的非原子性導致數據競爭。理解「讀取-修改-寫入」的拆分過程,是掌握並發編程同步機制的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved