当多个进程分享数据的时候,对某段程序代码要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; } } }