当前位置:首页 > C# > 正文

C#单例模式详解(懒加载实现与线程安全指南)

在 C# 开发中,单例模式是一种非常常见的设计模式,它确保一个类在整个应用程序生命周期中只有一个实例,并提供全局访问点。而懒加载(Lazy Loading)是实现单例的一种高效方式——即只有在第一次使用时才创建实例,从而节省系统资源。

C#单例模式详解(懒加载实现与线程安全指南) C#单例模式 懒加载单例 C#设计模式 线程安全单例 第1张

什么是懒加载单例?

懒加载单例指的是:单例对象的实例不是在程序启动时就创建,而是在第一次被请求时才被初始化。这种方式可以延迟资源消耗,特别适用于那些创建成本较高、但可能不会被使用的对象。

基础版懒加载单例(非线程安全)

我们先来看一个最简单的懒加载实现:

public class SimpleSingleton{    // 私有静态字段,用于保存唯一实例    private static SimpleSingleton _instance;    // 私有构造函数,防止外部实例化    private SimpleSingleton() { }    // 公共静态属性,提供全局访问点    public static SimpleSingleton Instance    {        get        {            if (_instance == null)            {                _instance = new SimpleSingleton();            }            return _instance;        }    }}

这个实现看起来没问题,但在多线程环境下可能会出问题:如果有两个线程同时调用 Instance 属性,且此时 _instancenull,那么两个线程都可能进入 if 块并各自创建一个实例,这就破坏了单例的“唯一性”原则。

线程安全的懒加载单例

为了保证在多线程环境下的安全性,我们可以使用 lock 关键字来同步访问:

public class ThreadSafeSingleton{    private static ThreadSafeSingleton _instance;    private static readonly object _lock = new object();    private ThreadSafeSingleton() { }    public static ThreadSafeSingleton Instance    {        get        {            if (_instance == null)            {                lock (_lock)                {                    if (_instance == null)                    {                        _instance = new ThreadSafeSingleton();                    }                }            }            return _instance;        }    }}

这里采用了“双重检查锁定”(Double-Checked Locking)模式:第一次检查避免不必要的加锁开销,第二次在锁内再次检查确保只有一个线程能创建实例。这是经典的线程安全单例实现方式。

更优雅的方式:使用 Lazy<T>

从 .NET Framework 4.0 开始,C# 提供了 System.Lazy<T> 类,它内置了线程安全的懒加载机制,代码更简洁、更安全:

public class LazySingleton{    private static readonly Lazy<LazySingleton> _lazyInstance =        new Lazy<LazySingleton>(() => new LazySingleton());    private LazySingleton() { }    public static LazySingleton Instance => _lazyInstance.Value;}

这种方式不仅代码简洁,而且默认就是线程安全的(除非你显式指定 isThreadSafe: false)。它是现代 C# 开发中推荐的C#单例模式实现方式。

总结

- 如果你的应用是单线程的,简单懒加载即可;
- 如果涉及多线程,务必使用线程安全的实现;
- 推荐优先使用 Lazy<T> 方式,它兼顾性能、安全性和可读性。

掌握 C#设计模式中的单例模式,尤其是其懒加载实现,对于构建高性能、低耦合的应用程序至关重要。希望本教程能帮助你轻松理解并正确应用这一经典模式!