今天寫了一段測試Lock的代碼,以下:測試
namespace TLock { class Program { static void Main(string[] args) { TMyThread myThread = new TMyThread(); myThread.StartThread(); } } class TMyThread { private int i = 0; //共享變量 private Object lockFlag = new Object(); public void StartThread() { for(int j = 0; j<4; j++) { Thread thread = new Thread(ThdMethod); thread.Start(); } } private void ThdMethod() { Thread.Sleep(1000); while (true) { //lock(i),會直接報以下錯誤:int 不是lock要求引用的類型 lock (lockFlag) { i++; Console.WriteLine(i); if(i > 100) { break; } } } Console.ReadKey(); } } }
運行結果以下:spa
爲何會有大於100的記錄呢?線程
緣由是,每一個線程都有本身獨立的堆棧。當線程1將i寫成101,進入if語句,線程1中止,而後線程2進入lock,會在線程1的基礎上,再加1而後中止循環,以此類推,因此會存在多出來的3個。code