单例模式
单例模式
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
,则创建实例。这样可以确保只有一个线程能够创建实例,同时其他线程不会被阻塞,提高了效率和性能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!