死锁是指多个线程共享资源是,都占用同意部分资源,而且都在等待对方师范另一部分资源,从而导致程序停滞不前的情况

示例:

/// <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#(四十四)之线程死锁相关推荐

  1. [系统安全] 四十四.APT系列(9)Metasploit技术之基础用法万字详解及防御机理

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  2. 【Visual C++】游戏开发笔记四十四 浅墨DirectX教程十二 网格模型和X文件使用面面观

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8586540 作者:毛星云(浅墨 ...

  3. 【Visual C++】游戏开发笔记四十四 浅墨DirectX教程十二 网格模型和X文件使用面面观...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8586540 作者:毛星云(浅墨) ...

  4. Python编程基础:第四十四节 方法重写Method Overriding

    第四十四节 方法重写Method Overriding 前言 实践 前言 我们前面说了,子类继承于父类,可以调用父类的所有属性和方法.那么如果我们想在继承的过程中重新书写父类的某些方法,此时就用到了方 ...

  5. 四十四种Javascript技巧大全

    四十四种Javascript技巧大全 1.第一个给变量分配值时不要忘了var关键字. 分配值给未定义的变量将是该变量自动成为全局变量,应该避免全局变量. 2.使用 === 而不是 == 使用 == ( ...

  6. 四十四、深入Java 的序列化和反序列化

    @Author:Runsen @Date:2020/6/8 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  7. JavaScript学习(四十四)—in关键字的使用和for in循环遍历对象的属性

    JavaScript学习(四十四)-in关键字的使用和for in循环遍历对象的属性 一.in关键字的使用 作用:判断某个属性是否属于对象 格式:属性名称 in 对象名称 ; 返回值:如果返回的结果为 ...

  8. NeHe OpenGL教程 第四十四课:3D光晕

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. NeHe OpenGL第四十四课:3D光晕

    NeHe OpenGL第四十四课:3D光晕 3D 光晕 当镜头对准太阳的时候就会出现这种效果,模拟它非常的简单,一点数学和纹理贴图就够了.好好看看吧.   大家好,欢迎来到新的一课,在这一课中我们将扩 ...

  10. 【正点原子Linux连载】第四十四章 设备树下的LED驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

最新文章

  1. Hello,Word宏!
  2. AIR for IOS开发问题小结
  3. c#读取xml中特定节点的值(实例)
  4. c++11 多线程传参和生产者消费者实现
  5. 为什么说_br__标签需要闭合
  6. python字符串逆序输出代码_一行代码实现字符串逆序输出
  7. 如何部署 Hyperic ,使得从内网监测外网服务器
  8. 39 FI配置-财务会计-固定资产-组织结构-定义号码范围间隔
  9. 伯克利:serverless是下一代计算范式
  10. Oracle数据库的打开与关闭、后台进程
  11. TransE代码实践(很详细)
  12. 2022年成都市市长质量奖申报、评选、表彰、监督管理等活动
  13. 阿里安全IoT安全研究团队Leader谢君:如何黑掉无人机
  14. SMC在线气动制图软件PneuDraw
  15. 超级简单基于spring boot高速公路收费系统的设计与实现.rar(含源码及数据库文件)
  16. 英语3500词(九)future universe主题(2022.1.21)
  17. 儿童卡通城堡banner动画
  18. 玩转iOS开发:iOS 10 新特性《Siri Kit Intents Extension UI》
  19. bzoj3123【SDOI2013】森林
  20. 『NLP自然语言处理』中文文本的分词、去标点符号、去停用词、词性标注

热门文章

  1. 中国穷人与富人的差别:你就输在人情上
  2. 热烈祝贺博客排名29(沾光排名算法调整)
  3. 苹果7升级系统后无服务器,iPhone7显示无服务怎么办 iPhone7显示无服务解决办法...
  4. 重拾JavaSE学习笔记
  5. 2019天津计算机一级报名时间,2019年天津计算机等级考试报名时间
  6. 重要的节日那么多,要及时「缓存」你们的珍贵时光
  7. qt中如何由Double类型变为QString类型以及chop()的使用
  8. Python2.7获取QQ照片墙
  9. 从解读微表情、法律条文到合约金融壹账通惊艳世界人工智能大会
  10. win7系统硬盘取消自检方法