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

C# --- 单例类错误初始化 + 没有释放资源导致线程泄漏

C# --- 单例类错误初始化 + 没有释放资源导致线程泄漏

  • Background
  • 原因分析
    • 问题一: 错误初始化(使用了箭头函数)
    • 问题一: 没有Dispose资源

Background

  • 背景: service A的其中一个Api会向mq发送消息
  • 问题:线上发现这个服务经常有几百个线程在同时运行,怀疑是发生了线程泄漏
  • 什么是线程泄漏:代码产生了大量的不应该出现的线程,导致占用过多资源,严重影响系统性能

原因分析

经过排查发现了一下问题代码

public class Dispatch
{public static Dispatch Instance => new Dispatch();private readonly Sender senderpublic Dispatch() { sender = new Sender();}
}public class Sender : IDisposable
{private readonly Task _recoveryTask;public Sender() { recoveryTask = Task.Factory.StartNew(new Action(this.ReceoveryTaskEntry), TaskCreationOptions.LongRunning)}private void RecoveryTaskEntry() {while (!this.Disposed){//impl}}public void Dispose() {_recoveryTask.Dispose()GC.SuppressFinalize(this); // 阻止终结器调用}
}

问题一: 错误初始化(使用了箭头函数)

public static Dispatch Instance => new Dispatch();//等价于
public static Dispatch Instance() 
{return new Dispatch();
}

以上代码在 Dispatch.Insatnce被调用时每次都会新建一个Dispatch实例,而Dispatch的构造方法里会创建并运行一个新的线程,也就是说每个requets都会创建一个新的线程

正确的初始化:保证单例类只有一个实例

public static Dispatch Instance { get; } = new Dispatch();

问题一: 没有Dispose资源

在Dispatch中没有dispose sender, 导致线程没有被释放

public class Dispatch
{public static Dispatch Instance => new Dispatch();private readonly Sender senderpublic Dispatch() { sender = new Sender();}
}

正确实现:在Dispose中释放资源

public class Dispatch
{public static Dispatch Instance => new Dispatch();private readonly Sender senderpublic Dispatch() { sender = new Sender();}public void Dispose() {sender.Dispose()//....}
}
http://www.dtcms.com/a/282772.html

相关文章:

  • The 2024 ICPC Asia Shenyang Regional Contest B. Magical Palette
  • Docker容器技术讲解
  • Liunx练习项目6-创建dns服务器
  • 主机安全---开源wazuh安装
  • 深入理解概率图模型:贝叶斯网络因子分解、d-分离与马尔可夫毯
  • 基于用户空间操作IIC接口调试云台电机
  • 7.16 Java基础 | 集合框架(上)
  • 微服务架构中实现跨服务的字段级权限统一控制
  • PyTorch深度学习框架入门案例实战
  • 第一章 【vue】基础(超详细)
  • 【动归解题套路框架】【带备忘录的递归】【最优子结构】【自下而上DP table】
  • Spring核心注解@RequestMapping详解
  • Java 二维数组详解:从基础语法到实战应用,彻底掌握多维数据结构
  • 边缘计算革命:AWS Snowcone在智慧工厂的落地实践(2025工业4.0实战指南)
  • 笔试——Day10
  • 【AI交叉】天文学:人工智能如何赋能星辰大海的探索
  • 如何关闭Elasticsearch的安全认证的解决方法
  • Maven入门指南:生命周期、阶段和执行顺序详解
  • 基于深度学习的情感分析模型:从文本数据到模型部署
  • leetcode:990.等式方程的可满足性[图]
  • 推荐《Python 编程:从入门到实践》之Python编程的基础知识
  • 经典算法之基数排序
  • 算法精讲--正则表达式(二):分组、引用与高级匹配技术
  • 基站前传卡 加速卡 EU
  • 一个项目的完整一生 --- 一 窗口大小设置
  • NW956NW961美光固态闪存NW964NW968
  • 如何建立一個單一產品的 Shopify 商店
  • 倪海厦全套下载,八纲辨证,人纪,天纪,针灸,电子版
  • lesson15:Python的文件操作
  • Java-数构栈与队列