在 C# 开发中,单例模式是一种非常常见的设计模式,它确保一个类在整个应用程序生命周期中只有一个实例,并提供全局访问点。而懒加载(Lazy Loading)是实现单例的一种高效方式——即只有在第一次使用时才创建实例,从而节省系统资源。
懒加载单例指的是:单例对象的实例不是在程序启动时就创建,而是在第一次被请求时才被初始化。这种方式可以延迟资源消耗,特别适用于那些创建成本较高、但可能不会被使用的对象。
我们先来看一个最简单的懒加载实现:
public class SimpleSingleton{ // 私有静态字段,用于保存唯一实例 private static SimpleSingleton _instance; // 私有构造函数,防止外部实例化 private SimpleSingleton() { } // 公共静态属性,提供全局访问点 public static SimpleSingleton Instance { get { if (_instance == null) { _instance = new SimpleSingleton(); } return _instance; } }} 这个实现看起来没问题,但在多线程环境下可能会出问题:如果有两个线程同时调用 Instance 属性,且此时 _instance 为 null,那么两个线程都可能进入 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)模式:第一次检查避免不必要的加锁开销,第二次在锁内再次检查确保只有一个线程能创建实例。这是经典的线程安全单例实现方式。
从 .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#设计模式中的单例模式,尤其是其懒加载实现,对于构建高性能、低耦合的应用程序至关重要。希望本教程能帮助你轻松理解并正确应用这一经典模式!
本文由主机测评网于2025-12-15发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025128001.html