C# 多线程基础 锁 死锁 Monitor lock

news/2025/1/14 10:05:37/

设置俩个 共享对象 lock1 lock2 模拟竞争情况
在主线程和子线程 分别使用 monitor 以及 lock 对这俩个对象 分别上锁以及使用
通过 net 8控制台代码实例 看下效果 讲解在代码后

class Program
{static void Main(string[] args){object lock1 = new object();object lock2 = new object();new Thread(() => LockOther(lock1, lock2)).Start();lock (lock2){Thread.Sleep(1000);Console.WriteLine("主线程使用Monitor.TryEnter获取锁lock1,获取超时释放");if (Monitor.TryEnter(lock1, TimeSpan.FromSeconds(3))){Console.WriteLine("主线程Monitor拿到锁lock1");}else{Console.WriteLine("主线程Monitor没拿到锁lock1");}}Console.WriteLine("------------第二个案列---------------");new Thread(() => LockOther(lock1, lock2)).Start();lock (lock2){Console.WriteLine("主线程使用lock,会出现死锁后面代码一直不执行");Thread.Sleep(2000);lock (lock1){Console.WriteLine("主线程lock方式拿到锁lock1");}}Console.ReadKey();}static void LockOther(object lock1, object lock2){Console.WriteLine("子线程开始 线程id:" + Thread.CurrentThread.ManagedThreadId);lock (lock1){Console.WriteLine("子线程锁住lock1");Thread.Sleep(1000);lock (lock2){Console.WriteLine("子线程锁住lock2");}}Console.WriteLine("锁结束");}}

在这里插入图片描述

讲解
正常逻辑 主线程 子线程 在一开始分别 各锁住了一个对象 然后在各自业务中使用另一个对象
那么要使用另一个对象 必须等待释放

案列2
1:代码没有完全都执行 可以看出 在锁住另一个对象后的代码 像是卡住没办法执行了
2:这好像就是正常逻辑情况下会出现的情况 也就是 死锁的定义表现
3:通俗将就是 俩个人都各自锁住一个资源 而恰好 要使用的其他资源 都是对方所持有的,无限等待

案列1
1:第一个案列可以看到 所有的代码逻辑都执行了
2:可以看到主线程是没拿到锁lock1 的 正常逻辑也是子线程拥有的 肯定拿不到
3:说明了Monitor.TryEnter 使用在拿不到的情况下 过期时间会自动放弃获取

总结:
1.死锁 使用lock用法 在两方对于资源 各持有且其他引用无法释放无限等待情况
2.Monitor.TryEnter 提供过期时间 避免无限等待 解决死锁问题
3.lock 是Monitor 语法糖 但是并没提供 TryEnter这种过期写法


http://www.ppmy.cn/news/1563003.html

相关文章

C语言二级考试

你必须知道的 二级考试不是编写程序,或者说不只是编程的考核,它还会考核计算机C语言相关语言还有内涵等基础知识,比较全面综合(说人话,要看最新考纲具备一定的基础知识) 考试时间 120 分钟 分值 100 分&…

LED灯按键调光芯片、PWM调光IC、发光灯控制调光芯片

按键调光芯片,特别是LED灯使用PWM调光的芯片IC,是一种用于控制LED灯具亮度的集成电路,常用于台灯、壁灯、吊灯等照明设备中。这种芯片通过脉冲宽度调制(PWM)技术来调节LED的亮度,可以实现从最亮到最暗的平滑…

aws(学习笔记第二十三课) step functions进行开发(lambda函数调用)

aws(学习笔记第二十三课) 开发step functions状态机的应用程序 学习内容: step functions状态机的概念开发简单的step functions状态机 1. step functions状态机概念 官方说明文档和实例程序 AWS的官方给出了学习的链接和实例程序。使用SAM创建step functions 借…

贪心算法汇总

1.贪心算法 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 如何能看出局部最优是否能推出整体最优 靠自己手动模拟,如果模拟可行,就可以试一试贪心策略,如果不可行,可能需要动态规划。 如何验证可不可以…

scala基础学习(数据类型)-集合

文章目录 集合创建集合isEmpty获取数据添加元素删除元素常见方法交集 &差集 diff --并集 unionto stringto listto Arrayto Map其余常用方法 集合 Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的。 Scala 集合分为可变的和不可变的集合。 默认情…

深入理解计算机系统阅读笔记-第十二章

第12章 网络编程 12.1 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的。根据这个模型,一个应用时由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务。例如&#xf…

【设计模式】工厂方法

工厂方法设计模式引入 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 工厂方法设计模式分为简单工厂、工厂方法和抽象工厂三个小类。以咖啡店点餐系统为案例展开讲解。咖啡店点餐系统初始设计包含咖啡类&#xff0…

Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库

Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库 目录 Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库一、为备库配置静态监听1、配置 li…