C# 关于lock锁的理解
C#的lock锁我用了很久了,今天用的时候突然有点迷惑,就查了点资料,写了段代码,帮助理解,记录一下
static void Test() { LockTest lockTest = new LockTest(); Task.Run(() => { //多线程才会用到锁 for (int i = 0; i < 3; i++) { lockTest.AAA(); } }); Task.Run(() => { for (int i = 0; i < 3; i++) { lockTest.AAA(); //2个异步线程同时调用AAA函数,证明lock(_lock)的同一块代码是互斥的 } }); for (int i = 0; i < 3; i++) { lockTest.BBB(); //再在主线程调用BBB,证明lock(_lock)不是同一块代码也是互斥的,只要lock的是同一个对象 } Console.ReadKey(); } class LockTest { readonly object _lock = new object(); //锁的对象最好是引用类型,私有的,只读的,职责单一的 public void AAA() { lock (_lock) { //当锁住_lock时,其他线程就不能走这块代码了,必须等当前线程走完后释放锁才行 Console.WriteLine(DateTime.Now + " 进入AAA 线程" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(1000); Console.WriteLine(DateTime.Now + " 完成AAA 线程" + Thread.CurrentThread.ManagedThreadId); } } public void BBB() { lock (_lock) { //其他地方锁住_lock后也会影响这里,因为_lock是同一个东西,所以这里也不能往下走了,直到其他地方的线程释放锁 Console.WriteLine(DateTime.Now + " 进入BBB 线程" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(1000); Console.WriteLine(DateTime.Now + " 完成BBB 线程" + Thread.CurrentThread.ManagedThreadId); } } }
运行结果