Lock的用法,为什么要用?

时间:2023-03-10 05:06:01
Lock的用法,为什么要用?

当多个进程分享数据的时候,对某段程序代码要lock(当对分享数据进行改写的时候)。

我们先看些这段代码:

namespace ThreadTest
{
class Program
{
static bool done;
static void Main(string[] args)
{
new Thread(Go).Start();
Go();
Console.ReadKey();
}
static void Go()
{
if (!done)
{
                done = true;
                Console.WriteLine("Done");
            } 
}
}
}

字段“Done”是两个进程分享的,所以结果输出一个“Done”;但是我们如果把两句程序颠倒一下:

        static void Go()
{
if (!done)
{
Console.WriteLine("Done");
done = true;
}
}

一个进程还没来得及把"done"设置为true的时候,另一个进程可能已经输出了,这就大大的加大了输出两个Done的可能性。

所以,我们需要lock,当给共享变量赋值的时候,可以给程序锁住,这样另一个进程就只能等待,直到lock解除。

        static bool done;
static readonly object locker = new object();
static void Main(string[] args)
{
new Thread(Go).Start();
Go();
Console.ReadKey();
}
static void Go()
{
lock(locker)
{
if (!done)
{
Console.WriteLine("Done");
done = true;
}
}
}