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);
                }
            }
        }

 运行结果

 

posted @ 2022-09-22 16:45  WmW  阅读(940)  评论(0编辑  收藏  举报