C#中多个线程同时增加一未加锁共享变量的值,最后却不等于总增加值的问题
我最近学C#,看到《C#高级编程(第7版)》(Professoinal C# 4 and .NET 4)中20.9.1节(Lock 语句和线程安全)的一个内容,大概说:
同时运行20个相同的任务,这个任务会循环50000次每次给一个共享变量加1,这样,50000*20=1000000,最后这个变量将是1000000,但是事实上并非如此,代码贴到下面(控制台程序):
public class SharedState
{
public int State { get; set; }
}
public class Job
{
SharedState sharedState;
public Job(SharedState sharedState)
{
this.sharedState = sharedState;
}
public void DoTheJob()
{
for (int i = 0; i < 50000; i++)
{
sharedState.State += 1;
}
}
}
class Program
{
static void Main(string[] args)
{
int numTasks = 20;
var state = new SharedState();
var tasks = new Task[numTasks];
for (int i = 0; i < numTasks; i++)
{
tasks[i] = new Task(new Job(state).DoTheJob);
tasks[i].Start();
}
for (int i = 0; i < numTasks; i++)
tasks[i].Wait();
Console.WriteLine("summarized {0}",state.State);
Console.ReadLine();
}
}