C#(四十四)之线程死锁
死锁是指多个线程共享资源是,都占用同意部分资源,而且都在等待对方师范另一部分资源,从而导致程序停滞不前的情况
示例:
/// <summary>/// 定义一个刀/// </summary>public static object knife = new object();/// <summary>/// 定义一把叉子/// </summary>public static object fock = new object();static void Main(string[] args){Thread threadgirl = new Thread(delegate() {lock (knife){Console.WriteLine("外边的风景好美");getKnife();lock (fock){getFock();eat();Console.WriteLine("女孩放下了叉");Monitor.Pulse(fock);}Console.WriteLine("女孩放下了刀
");Monitor.Pulse(knife);}});threadgirl.Name = "女孩";Thread threadboy = new Thread(delegate(){lock (fock){Console.WriteLine("你更美");getFock();lock (knife){getKnife();eat();Console.WriteLine("男孩放下了叉");Monitor.Pulse(knife);}Console.WriteLine("男孩放下了刀");Monitor.Pulse(fock);}});threadboy.Name = "男孩";threadgirl.Start();threadboy.Start();Console.ReadLine();}public static void eat(){Console.WriteLine(Thread.CurrentThread.Name+"吃了一块牛排");}public static void getKnife(){Console.WriteLine(Thread.CurrentThread.Name+"拿起了刀子");}public static void getFock(){Console.WriteLine(Thread.CurrentThread.Name+"拿起了叉子");}
输出结果:
外边的风景好美
女孩拿起了刀子
女孩拿起了叉子
女孩吃了一块牛排
女孩放下了叉
女孩放下了刀
你更美
男孩拿起了叉子
男孩拿起了刀子
男孩吃了一块牛排
男孩放下了叉
男孩放下了刀
这样输出是正常的,如何让其变成死锁呢?
在两次锁定之间让其暂停一会,如下 增加 thread.Sleep(100);
Thread threadgirl = new Thread(delegate() {lock (knife){Console.WriteLine("外边的风景好美");getKnife();Thread.Sleep(100);lock (fock){getFock();eat();Console.WriteLine("女孩放下了叉");Monitor.Pulse(fock);}Console.WriteLine("女孩放下了刀
");Monitor.Pulse(knife);}});
输出结果:
外边的风景好美
女孩拿起了刀子
你更美
男孩拿起了叉子
为什么会出现这样的结果呢?
仔细观察第一部分代码,会发现,男孩和女孩两次锁定的对象顺序不同,女孩第一次锁定是刀,第二次是叉子。男孩正好相反。
将锁定的对象顺序改为一致之后,死锁消失。
多线程避免死锁关键,锁定对象顺序要相同。
有好的建议,请在下方输入你的评论。
欢迎访问个人博客
https://guanchao.site
欢迎访问小程序:
C#(四十四)之线程死锁相关推荐
- [系统安全] 四十四.APT系列(9)Metasploit技术之基础用法万字详解及防御机理
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...
- 【Visual C++】游戏开发笔记四十四 浅墨DirectX教程十二 网格模型和X文件使用面面观
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8586540 作者:毛星云(浅墨 ...
- 【Visual C++】游戏开发笔记四十四 浅墨DirectX教程十二 网格模型和X文件使用面面观...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8586540 作者:毛星云(浅墨) ...
- Python编程基础:第四十四节 方法重写Method Overriding
第四十四节 方法重写Method Overriding 前言 实践 前言 我们前面说了,子类继承于父类,可以调用父类的所有属性和方法.那么如果我们想在继承的过程中重新书写父类的某些方法,此时就用到了方 ...
- 四十四种Javascript技巧大全
四十四种Javascript技巧大全 1.第一个给变量分配值时不要忘了var关键字. 分配值给未定义的变量将是该变量自动成为全局变量,应该避免全局变量. 2.使用 === 而不是 == 使用 == ( ...
- 四十四、深入Java 的序列化和反序列化
@Author:Runsen @Date:2020/6/8 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...
- JavaScript学习(四十四)—in关键字的使用和for in循环遍历对象的属性
JavaScript学习(四十四)-in关键字的使用和for in循环遍历对象的属性 一.in关键字的使用 作用:判断某个属性是否属于对象 格式:属性名称 in 对象名称 ; 返回值:如果返回的结果为 ...
- NeHe OpenGL教程 第四十四课:3D光晕
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL第四十四课:3D光晕
NeHe OpenGL第四十四课:3D光晕 3D 光晕 当镜头对准太阳的时候就会出现这种效果,模拟它非常的简单,一点数学和纹理贴图就够了.好好看看吧. 大家好,欢迎来到新的一课,在这一课中我们将扩 ...
- 【正点原子Linux连载】第四十四章 设备树下的LED驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
最新文章
- Hello,Word宏!
- AIR for IOS开发问题小结
- c#读取xml中特定节点的值(实例)
- c++11 多线程传参和生产者消费者实现
- 为什么说_br__标签需要闭合
- python字符串逆序输出代码_一行代码实现字符串逆序输出
- 如何部署 Hyperic ,使得从内网监测外网服务器
- 39 FI配置-财务会计-固定资产-组织结构-定义号码范围间隔
- 伯克利:serverless是下一代计算范式
- Oracle数据库的打开与关闭、后台进程
- TransE代码实践(很详细)
- 2022年成都市市长质量奖申报、评选、表彰、监督管理等活动
- 阿里安全IoT安全研究团队Leader谢君:如何黑掉无人机
- SMC在线气动制图软件PneuDraw
- 超级简单基于spring boot高速公路收费系统的设计与实现.rar(含源码及数据库文件)
- 英语3500词(九)future universe主题(2022.1.21)
- 儿童卡通城堡banner动画
- 玩转iOS开发:iOS 10 新特性《Siri Kit Intents Extension UI》
- bzoj3123【SDOI2013】森林
- 『NLP自然语言处理』中文文本的分词、去标点符号、去停用词、词性标注
热门文章
- 中国穷人与富人的差别:你就输在人情上
- 热烈祝贺博客排名29(沾光排名算法调整)
- 苹果7升级系统后无服务器,iPhone7显示无服务怎么办 iPhone7显示无服务解决办法...
- 重拾JavaSE学习笔记
- 2019天津计算机一级报名时间,2019年天津计算机等级考试报名时间
- 重要的节日那么多,要及时「缓存」你们的珍贵时光
- qt中如何由Double类型变为QString类型以及chop()的使用
- Python2.7获取QQ照片墙
- 从解读微表情、法律条文到合约金融壹账通惊艳世界人工智能大会
- win7系统硬盘取消自检方法