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); } } }
运行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~