日常生活的交流与学习

首页 新随笔 联系 管理

单例模式

单例模式

  public class Singleton
{
    // 定义一个静态变量来保存类的实例
    private static Singleton uniqueInstance;
    // 定义一个标识确保线程同步
    private static readonly object locker = new object();
    // 定义私有构造函数,使外界不能创建该类实例
    private Singleton()
    {
    }
    /// <summary>
    /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
    /// </summary>
    /// <returns></returns>
    public static Singleton GetInstance()
    {// 双重锁定只需要一句判断就可以了
        if (uniqueInstance == null)
        {
            lock (locker)
            {
                // 如果类的实例不存在则创建,否则直接返回
                if (uniqueInstance == null)
                {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

这段代码定义了一个名为 Singleton 的类,它实现了单例模式。单例模式确保整个应用程序中该类只有一个实例,并提供一个全局访问点来获取这个实例。

具体来说:

  1. 私有静态成员 unique Instance 用于存储 Singleton 类的唯一实例。
  2. 私有静态对象 locker 用于保证多线程环境下实例化过程的线程安全。
  3. 私有构造函数 Singleton() 防止外部通过构造函数创建新实例。
  4. 公有静态方法 Get Instance() 提供了获取 Singleton 类实例的方法。该方法首先检查是否已存在实例,如果不存在,则在一个线程安全的区域内创建新实例;如果已存在,则直接返回现有实例。

这种实现方式采用了双重检查锁定(Double-Checked Locking)机制来优化性能,只在真正需要创建实例时执行同步操作。

双重检查锁定机制(Double-Checked Locking)

是一种在多线程环境中创建线程安全的单例实例的技术。它主要由两个部分组成:

  1. 第一次检查:在进入同步代码块之前,先检查实例是否已经被创建。如果实例已经存在,则直接返回该实例,避免不必要的同步开销。
  2. 第二次检查:如果第一次检查发现实例尚未创建,则进入同步代码块,在这个线程安全的区域内再次检查实例是否存在,如果仍然不存在,则创建实例。

这种方式可以减少同步代码块的执行次数,提高程序性能。在您提供的代码示例中,双重检查锁定机制体现在以下部分:

if (uniqueInstance == null) // 第一次检查
{
    lock (locker) // 进入同步区域
    {
        if (uniqueInstance == null) // 第二次检查
        {
            uniqueInstance = new Singleton(); // 创建实例
        }
    }
}

这里的关键在于,即使多个线程几乎同时到达第一次检查,大多数线程都会在第一次检查时返回,只有当 uniqueInstancenull 时,才会有一个线程进入锁区,并在那里再次检查 uniqueInstance 是否仍然为 null。如果此时 uniqueInstance 仍然为 null,则创建实例。这样可以确保只有一个线程能够创建实例,同时其他线程不会被阻塞,提高了效率和性能。

posted on 2024-08-28 19:14  lazycookie  阅读(50)  评论(0编辑  收藏  举报