C#中的lock、Monitor、Mutex学习笔记

2019-12-26 12:18:20于海丽

        Example ex=new Example ();
        Thread []threads=new  Thread[5];
        for (int i=0;i<5;i++)
        {
        threads[i]=new Thread (new ThreadStart(ex.OutPut));
        threads[i].Name =string.Format ("Worker thread#{0}",i) ;
        }
        foreach(Thread t in threads){
        t.Start();
        }
        Console.WriteLine("主线程最后一句代码!"+DateTime.Now.ToString());
        }
    }
    class Example{
    private static object  thisLock=new object ();
    public void OutPut()
    {    
    lock(thisLock){
    Console .WriteLine("->{0}",Thread.CurrentThread.Name);
    Thread.Sleep(1000);
    Console.WriteLine(DateTime.Now);
    }
    }
    
    }
}

 

实验结果如下:

C#中的lock、Monitor、Mutex学习笔记

           图1:加lock

C#中的lock、Monitor、Mutex学习笔记

      图2:没有lock    

从实验结果可以看出,加lock后,程序每次只能执行一个线程,只有当前线程执行完了,才会执行下一个线程未加lock,程序执行混乱,容易阻塞。

2. Monitor

lock是对Monitor的Enter和Exit的一个封装,因此Monitor类的Enter()和Exit()方法的组合使用可以用lock关键字替代。