线程同步问题就是解决多个线程同时操作一个资源的问题
{
private static int counter = 0;
static void Main(string[] args)
{
Thread t1 = new Thread(() => {
for (int i = 0; i < 1000; i++)
{
counter++; Thread.Sleep(1);
}
});
t1.Start();
Thread t2 = new Thread(() => {
for (int i = 0; i < 1000; i++)
{
counter++; Thread.Sleep(1);
}
}); t2.Start();
while (t1.IsAlive) { };
while (t2.IsAlive) { };
Console.WriteLine(counter);
Console.ReadKey();
}
}
上面分别开启了两个线程来同时运行,打印结果是多少?反正不会是2000,不信自己验证下,反正代码都放在这里了。
注意: while (t1.IsAlive) ;操作会大量消耗 cpu 空转,可以改成 t1.Join()就是让当前线程等待 t1 线程的结 束。
关于如何解决上面打印结果不是2000的问题(这就是两个线程同步都在运行,带来的结果误差)
一种方式我们首先应该想到的是加锁(lock),改用 lock 解决多个线程同时操作一个资源。lock 是 C#中的关键字,他要锁定一个资源,lock 的 特点是:同时只能有一个线程进入
lock 的对象的范围,其他 lock 的线程就要等。
{
private static int counter = 0;
private static object locker = new object();
static void Main(string[] args)
{
Thread t1 = new Thread(() => {
for (int i = 0; i < 1000; i++)
{
lock (locker)
{ counter++; }
Thread.Sleep(1);
}
});
t1.Start();
Thread t2 = new Thread(() => {
for (int i = 0; i < 1000; i++)
{
lock (locker)
{ counter++; }
Thread.Sleep(1);
}
}); t2.Start();
while (t1.IsAlive) { };
while (t2.IsAlive) { };
Console.WriteLine(counter);
Console.ReadKey();
}
}
最后运行正确是2000,不信自己玩下。