今天写了一段测试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