當多個進程分享數據的時候,對某段程序代碼要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; } } }