C# 延迟初始化 Lazy<T>
概念:延时初始化重点是延时,用时加载,意思是对象在使用的时候创建而不是在实例化的的时候才创建。
延时加载主要应用的场景:
-
数据层(ADO.NET或Entity Framework等ORM,Java里面的Hibernate也用到了这种技术)
-
反射(加载assemblier,type,MEF)
-
缓存对象,领域实体
-
单例模式
其二,就是其线程安全问题。用单例模式举例,如下是经常看到的代码:
public sealed class Singleton
{
private static Singleton instance = null;
private Singleton()
{
}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
这段代码如果只有一个线程使用,也并不会出现问题;其问题是多线程使用时,两个不同的线程可能都对其进行了访问,如果(instance==null)结果为true,则都创建了实例,这违反了singleton模式。
如下是使用Lazy实现线程安全的解决方案:
public sealed class Singleton
{
private static readonly Lazy<Singleton> lazy =
new Lazy<Singleton>(() => new Singleton());
public static Singleton Instance { get { return lazy.Value; } }
private Singleton()
{
}
}
MSDN相关说明:https://docs.microsoft.com/en-us/dotnet/api/system.lazy-1?redirectedfrom=MSDN&view=netframework-4.8
关于单例模式各种写法的分析:https://csharpindepth.com/Articles/Singleton