分享一下C#单例模板类SingletonTemplate<T>

这段代码实现了一个通用的单例模板类SingletonTemplate<T>。单例模式是一种软件设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来获取该实例。

cs 复制代码
public class SingletonTemplate<T> where T : class, new()
{
    private static T m_instance;

    private static readonly object m_lock = new object();

    public static T GetInstance()
    {
        // 先尝试不进入锁的情况下获取实例
        if (m_instance == null)
        {
            // 进入锁后再次检查
            lock (m_lock)
            {
                if (m_instance == null)
                {
                    // 使用 Lazy<T> 确保实例只在第一次访问时创建
                    m_instance = new Lazy<T>(() => new T()).Value;
                }
            }
        }

        return m_instance;
    }
}

在多线程环境下,使用Lazy<T>可以确保实例只在第一次被访问时创建,避免了每次进入锁后都进行实例创建的开销。Lazy<T>在内部会处理线程安全问题,无需手动进行双重检查锁定。

  • Lazy<T>是.NET 框架中的一个类型,它的主要目的是延迟对象的初始化,直到这个对象第一次被使用。这在创建成本较高的对象或者对象可能并不总是需要被创建的情况下非常有用。
  • 当创建Lazy<T>实例时,可以指定一个委托(通常是一个 lambda 表达式或者一个方法引用)来表示如何创建T类型的对象。例如:Lazy<T> lazy = new Lazy<T>(() => new T());,这里的() => new T()就是一个创建T对象的委托。
  • 在没有调用Lazy<T>实例的Value属性之前,T类型的对象不会被创建。一旦Value属性被访问,Lazy<T>就会调用之前指定的委托来创建对象,并且缓存这个结果。后续对Value属性的访问将直接返回缓存的结果,而不会再次创建对象。
相关推荐
FL16238631297 分钟前
[cmake]基于C++使用纯opencv部署ppocrv5v6的onnx模型
开发语言·c++·opencv
云烟成雨TD10 分钟前
Spring AI 1.x 系列【61】Spring AI 2.0 升级指南
java·人工智能·spring
lulu12165440781 小时前
OpenRouter Fusion 多模型融合架构深度拆解:预算级模型组团打平 Fable 5,多模型协作才是 AGI 的正确打开方式?
java·人工智能·架构·ai编程·agi
雨辰AI1 小时前
生产级实测:SpringBoot3 + 达梦数据库接口从 200ms 优化至 20ms 完整调优指南
java·数据库·spring boot·后端·政务
(Charon)2 小时前
【C++ 面试高频:内存管理、RAII 和智能指针详解】
java·开发语言·word
凡人叶枫2 小时前
Effective C++ 条款39:明智而审慎地使用 private 继承
java·数据库·c++·嵌入式开发
轻刀快马2 小时前
跨越软硬件的共鸣(二):从 Cache 写策略看 Redis 与 DB 的一致性博弈
java·开发语言·redis·计算机组成原理
折哥的程序人生 · 物流技术专研2 小时前
Java 23 种设计模式:从踩坑到精通 | 装饰器模式 —— 比继承更灵活的扩展方式,你用过吗?
java·装饰器模式·java面试·结构型模式·java设计模式·javaio·从踩坑到精通
lili00122 小时前
2026 企业 AI 选型新范式:OpenRouter Fusion 证明多模型融合性价比远超单模型,企业该如何重构技术栈? - 微元算力(weytoken)
java·人工智能·python·重构·ai编程