单例模式
单例模式
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
的类,它实现了单例模式。单例模式确保整个应用程序中该类只有一个实例,并提供一个全局访问点来获取这个实例。
具体来说:
- 私有静态成员
unique Instance
用于存储Singleton
类的唯一实例。 - 私有静态对象
locker
用于保证多线程环境下实例化过程的线程安全。 - 私有构造函数
Singleton()
防止外部通过构造函数创建新实例。 - 公有静态方法
Get Instance()
提供了获取Singleton
类实例的方法。该方法首先检查是否已存在实例,如果不存在,则在一个线程安全的区域内创建新实例;如果已存在,则直接返回现有实例。
这种实现方式采用了双重检查锁定(Double-Checked Locking)机制来优化性能,只在真正需要创建实例时执行同步操作。
双重检查锁定机制(Double-Checked Locking)
是一种在多线程环境中创建线程安全的单例实例的技术。它主要由两个部分组成:
- 第一次检查:在进入同步代码块之前,先检查实例是否已经被创建。如果实例已经存在,则直接返回该实例,避免不必要的同步开销。
- 第二次检查:如果第一次检查发现实例尚未创建,则进入同步代码块,在这个线程安全的区域内再次检查实例是否存在,如果仍然不存在,则创建实例。
这种方式可以减少同步代码块的执行次数,提高程序性能。在您提供的代码示例中,双重检查锁定机制体现在以下部分:
if (uniqueInstance == null) // 第一次检查
{
lock (locker) // 进入同步区域
{
if (uniqueInstance == null) // 第二次检查
{
uniqueInstance = new Singleton(); // 创建实例
}
}
}
这里的关键在于,即使多个线程几乎同时到达第一次检查,大多数线程都会在第一次检查时返回,只有当 uniqueInstance
为 null
时,才会有一个线程进入锁区,并在那里再次检查 uniqueInstance
是否仍然为 null
。如果此时 uniqueInstance
仍然为 null
,则创建实例。这样可以确保只有一个线程能够创建实例,同时其他线程不会被阻塞,提高了效率和性能。