我有一个实现Singleton设计模式的对象缓存。我对单例的方法总是在首次访问属性时延迟加载静态实例。
public static Widget
{
get
{
if(instance==null) instance = new Widget();
return instance;
}
}
但是,我知道这种方法不是线程安全的,并且实例检查为null会导致效率低下。在实例化静态实例的类上实现静态构造函数是否明智?
据我所知,只要第一次静态属性访问发生,就会调用静态构造函数。这是否有效,它是否会提供超过当前延迟加载方法的任何好处,或者更好地探索代理实现,还是使用锁来强制它是线程安全的?
public static Widget
{
get
{
if(instance==null)
{
lock(padlock)
{
if(instance==null) instance = new Widget();
}
}
return instance;
}
}
我没有很多静态构造函数的经验,所以如果它是延迟加载属性的相同或更差的实现,不要想要实现这个想法。
干杯, 加里
答案 0 :(得分:16)
Jon Skeet对单身人士有一个很好的article讨论这个问题。
答案 1 :(得分:2)
我建议您在Lazy<T>
上阅读msdn,而不是滚动自己的线程安全延迟初始化程序并可能出错。