當多個線程同時訪問共享變量且至少一個線程進行寫入操作時,若不採取同步措施,就會發生數據競爭,導致程序結果與預期不符,這就是線程不安全。
假設堆上有一個共享變量 int a = 100,兩個線程並發執行遞增邏輯:
// 線程 1 和 線程 2 同時執行
int c = a; // 讀取共享變量
c = c + 1; // 本地計算
a = c; // 寫回共享變量(相當於 a++)
兩個線程各執行一次,a 應從 100 變為 102。
a=100 到 c,計算 c=101a=100 到 c,計算 c=101(此時線程 1 尚未寫回)a=101a=101(覆蓋了線程 1 的結果)最終結果:a = 101,丟失了一次遞增!
a++ 看似一條語句,實際編譯為「讀取-修改-寫入」三步操作,非原子性。多線程交替執行這三步時,會相互覆蓋結果。
線程不安全的核心是複合操作的非原子性導致數據競爭。理解「讀取-修改-寫入」的拆分過程,是掌握並發編程同步機制的基石。