当前位置: 首页 > news >正文

死锁是怎么发生的,举个简单的例子

死锁的示例

下面就是一个会死锁的示例代码:

// 异步死锁示例 - 不使用 TaskScheduler,仅用多个 Task 互相等待Console.WriteLine("=== 多 Task 互相等待死锁 ===\n");// 两个任务互相用 .Result 等待对方完成 → 死锁
var tcsA = new TaskCompletionSource<int>();
var tcsB = new TaskCompletionSource<int>();var taskA = Task.Run(() =>
{Console.WriteLine($"[任务 A] 开始,线程 {Environment.CurrentManagedThreadId}");Console.WriteLine("[任务 A] 等待任务 B 的结果...");int resultB = tcsB.Task.Result; // A 阻塞等待 BConsole.WriteLine($"[任务 A] 收到 B 的结果: {resultB}");tcsA.SetResult(1);
});var taskB = Task.Run(() =>
{Console.WriteLine($"[任务 B] 开始,线程 {Environment.CurrentManagedThreadId}");Console.WriteLine("[任务 B] 等待任务 A 的结果...");int resultA = tcsA.Task.Result; // B 阻塞等待 AConsole.WriteLine($"[任务 B] 收到 A 的结果: {resultA}");tcsB.SetResult(2);
});Console.WriteLine("等待所有任务完成(将在此处挂起)...\n");
Console.WriteLine("死锁原因:");
Console.WriteLine("- 任务 A 用 .Result 阻塞等待 tcsB.Task 完成");
Console.WriteLine("- 任务 B 用 .Result 阻塞等待 tcsA.Task 完成");
Console.WriteLine("- tcsA.SetResult() 要等 A 等到 B 之后才会执行");
Console.WriteLine("- tcsB.SetResult() 要等 B 等到 A 之后才会执行");
Console.WriteLine("- A 等 B,B 等 A → 死锁\n");Task.WaitAll(taskA, taskB);Console.WriteLine("若看到这行说明未发生死锁(本示例中应看不到)");

任务 A: 阻塞在 tcsB.Task.Result → 等 B 完成
任务 B: 阻塞在 tcsA.Task.Result → 等 A 完成
              ↑_______________________________↓

  • A 要等到 tcsB.SetResult(2) 被调用才会从 .Result 返回
  • B 要等到 tcsA.SetResult(1) 被调用才会从 .Result 返回
  • 而 tcsA.SetResult(1) 在 A 里、tcsB.SetResult(2) 在 B 里,都要等对方先返回
  • 所以谁都不会先完成 → 死锁

解决办法

这个代码运行起来肯定会死锁,当然实际项目中死锁的发生比这个要复杂,但是道理相似。
解决办法就是把.Result这样的阻塞写法改成async await方式。

线程池饥饿

实际中可能是并发太高,线程池饥饿导致死锁,也就是:线程池里的工作线程数量有限。当大量任务都在阻塞等待(例如 .Result、.Wait()、Thread.Sleep()、lock 等)时,这些线程被占满且不会很快释放,新提交的任务只能在队列里等线程,就形成线程池饥饿:有活要干,但没有空闲线程来干。

http://www.jsqmd.com/news/330184/

相关文章:

  • 学长亲荐 9 个降AIGC网站 千笔·专业降AI率智能体解决论文AI痕迹
  • 横评后发现 9个AI论文软件:继续教育必看!毕业论文+格式规范全攻略
  • 一篇搞定全流程AI论文网站,千笔 VS 灵感ai,MBA专属神器!
  • 救命神器10个降AI率平台推荐!千笔AI帮你轻松降AIGC
  • 冥想第一千七百八十一天(1781)
  • Java毕设项目推荐-基于springboot 网上鲜花销售系统基于springboot的攀枝花市鲜花销售系统【附源码+文档,调试定制服务】
  • 2026必备!10个降AIGC工具推荐,千笔·降AIGC助手助你轻松降AI率
  • 计算机Java毕设实战-基于springboot智能鲜花商店销售系统基于springboot的攀枝花市鲜花销售系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Java毕设选题推荐:基于spring基于springboot的攀枝花市鲜花销售系统基于 SpringBoot 的鲜花电商与库存一体化运营平台 【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 课件2-1:列表(List)详解
  • 【课程设计/毕业设计】基于 SpringBoot 的鲜花电商与库存一体化运营平台 基于springboot的攀枝花市鲜花销售系统【附源码、数据库、万字文档】
  • 【计算机毕业设计案例】基于springboot的攀枝花市鲜花销售系统基于java+springboot+vue+mysql的攀枝花市鲜花销售系统(程序+文档+讲解+定制)
  • 课件1-3:Python输入输出
  • Java计算机毕设之基于java+springboot+vue+mysql的攀枝花市鲜花销售系统基于springboot的攀枝花市鲜花销售系统(完整前后端代码+说明文档+LW,调试定制等)
  • Python核心语法-python数据类型转换和Python运算符 - 努力-
  • DB-GPT 0.7.4 版本更新|开源蚂蚁集团Text2SQL信息集:Falcon、支持GLM-4.5大模型
  • spring ali alibaba整合Milvus向量数据库
  • 艾草种植合作找哪家?2026三大主流合作方测评,中艾集团凭全链优势登顶
  • Vue3 常用指令和Axios - 努力-
  • 大数据深度学习|计算机毕设项目|计算机毕设答辩|基于大数据专业岗位招聘信息的人才需求特征分析 系统设计与实现
  • P3349 [ZJOI2016] 小星星 题解 / 树形 DP 容斥
  • 大数据深度学习|计算机毕设项目|计算机毕设答辩|基于Django的电商数据分析系统的设计与实现
  • C++ 和 Java 创建对象的区别
  • 传说中的C#x2B;#x2B;精灵库,专治“C#x2B;#x2B;恐惧症”?
  • HTML学习笔记:超详细的 HTML 标签体系与应用指南
  • 基于滑膜控制的 ARS 与 DYC 协调稳定性控制:车辆高速行驶的安全保障
  • 冬训第一周总结
  • 书籍-费迪南德·冯·李希霍芬《李希霍芬中国旅行日记》
  • Java毕设项目:基于springboot的攀枝花市鲜花销售系统(源码+文档,讲解、调试运行,定制等)
  • 2026年市面上有实力的登车桥生产厂家怎么选,移动登车桥/防爆升降平台/登车桥/升降机/防爆升降机,登车桥厂商联系方式