多線程-Lock

今天寫了一段測試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

相關文章
相關標籤/搜索