C#怎么实现单例模式 C#如何正确实现线程安全的Singleton单例设计模式【设计模式】

张开发
2026/4/11 22:20:51 15 分钟阅读

分享文章

C#怎么实现单例模式 C#如何正确实现线程安全的Singleton单例设计模式【设计模式】
仅用static字段private构造函数不安全因多线程下可能同时通过null检查而创建多个实例应使用LazyT默认ExecutionAndPublication或DI容器注册实现真正线程安全单例。为什么 static 字段 private 构造函数还不够安全因为多线程下可能创建多个实例。常见错误是只加 private 构造函数和静态字段没控制初始化时机导致两个线程同时判断 instance null 为真各自 new 一次。典型现象Singleton.Instance.GetHashCode() 在高并发测试中返回不同值根本原因.NET 的静态字段初始化不是原子操作if (instance null) instance new Singleton(); 不是临界区别用双重检查锁定DCL手写锁——容易漏掉 volatile 或锁粒度不对C# 有更稳的方案推荐做法用 Lazyt/t 实现真正线程安全的单例Lazyt/t 内置线程安全保证且延迟初始化语义清晰、无竞态、无额外锁开销。必须指定 LazyThreadSafetyMode.ExecutionAndPublication默认值否则可能不安全构造函数仍需 private防止外部 new性能上首次访问有微小开销内部用 Monitor但之后完全无锁比手写锁更优示例public sealed class Singleton{ private static readonly LazySingleton _instance new LazySingleton(() new Singleton()); public static Singleton Instance _instance.Value; private Singleton() { }}如果必须用静态构造函数要注意什么静态构造函数本身线程安全但只能做“立即初始化”无法延迟加载且一旦抛异常类型将永久不可用。 Zeemo AI 一款专业的视频字幕制作和视频处理工具

更多文章