仅用static字段+private构造函数不安全,因多线程下可能同时通过null检查而创建多个实例;应使用Lazy<T>(默认ExecutionAndPublication)或DI容器注册实现真正线程安全单例。为什么 static 字段 + private 构造函数还不够安全因为多线程下可能创建多个实例。常见错误是只加 private 构造函数和静态字段,没控制初始化时机,导致两个线程同时判断 instance == null 为真,各自 new 一次。典型现象:Singleton.Instance.GetHashCode() 在高并发测试中返回不同值根本原因:.NET 的静态字段初始化不是原子操作,if (instance == null) instance = new Singleton(); 不是临界区别用双重检查锁定(DCL)手写锁------容易漏掉 volatile 或锁粒度不对,C# 有更稳的方案推荐做法:用 Lazy<t></t> 实现真正线程安全的单例Lazy<t></t> 内置线程安全保证,且延迟初始化,语义清晰、无竞态、无额外锁开销。必须指定 LazyThreadSafetyMode.ExecutionAndPublication(默认值),否则可能不安全构造函数仍需 private,防止外部 new性能上:首次访问有微小开销(内部用 Monitor),但之后完全无锁,比手写锁更优示例:public sealed class Singleton{ private static readonly Lazy<Singleton> _instance = new Lazy<Singleton>(() => new Singleton()); public static Singleton Instance => _instance.Value; private Singleton() { }}如果必须用静态构造函数,要注意什么静态构造函数本身线程安全,但只能做"立即初始化",无法延迟加载,且一旦抛异常,类型将永久不可用。 Zeemo AI 一款专业的视频字幕制作和视频处理工具
相关推荐
五月君_8 小时前
放弃 Python,Kimi 用 TS + Node.js 重写了一个 Kimi Code还是鼠鼠8 小时前
AI掘金头条新闻系统 (Toutiao News)-获取用户信息Cloud_Shy6189 小时前
解读《Effective Python 3rd Edition》:从练气到老魔SunnyDays10119 小时前
Python 操作 Excel 超链接:添加网页、文件、工作表和图片链接KaMeidebaby9 小时前
卡梅德生物技术快报|Western Blot 实验应用:肺肠轴机制研究全流程技术解析雨辰AI9 小时前
MySQL 迁移至达梦 DM9 完整改造指南|99% SQL 零改动li星野9 小时前
RAG优化系列:HyDE(假设文档嵌入)——让LLM先写答案再检索知识分享小能手9 小时前
Flask入门学习教程,从入门到精通,Flask智能租房——用户中心知识点详解(9)MageGojo9 小时前
做节日活动页时,如何用 API 快速生成对联内容l1t9 小时前
DeepSeek总结的使用实体-组件-系统和基于存在性处理进行Python编程15-17