这段代码实现了一个通用的单例模板类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
属性的访问将直接返回缓存的结果,而不会再次创建对象。