多執行緒同時對共享變數 number++ 非原子操作,導致結果小於預期。
int number = 0;
private void Test1() // 非原子
{
for (int m = 0; m < 10; m++)
{
number++;
Thread.Sleep(100);
}
Console.WriteLine(number);
}
private void Test2() // 原子
{
for (int m = 0; m < 10; m++)
{
Interlocked.Increment(ref number);
Thread.Sleep(100);
}
Console.WriteLine(number);
}
private void button1_Click(object sender, EventArgs e)
{
number = 0;
for (int i = 0; i < 10; i++) new Thread(Test1).Start();
}
private void button2_Click(object sender, EventArgs e)
{
number = 0;
for (int i = 0; i < 10; i++) new Thread(Test2).Start();
}
Test1:10 執行緒各遞增 10 次,理應 100,實際常 < 100(競態條件)。Test2:Interlocked.Increment 保證原子性,結果穩定為 100。System.Threading.Interlocked 提供 Increment、Decrement、Exchange、CompareExchange 等原子操作,是無鎖執行緒同步的基石。