怪物奇妙物语

宇宙无敌超级美少男的怪物奇妙物语

首页 新随笔 联系 管理
  822 随笔 :: 0 文章 :: 2 评论 :: 16万 阅读

单例模式

单例模式

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   超级无敌美少男战士  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示