静态构造函数&单身人士班

时间:2009-07-15 14:37:55

标签: c# multithreading static singleton

我有一个实现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;
        }
    }

我没有很多静态构造函数的经验,所以如果它是延迟加载属性的相同或更差的实现,不要想要实现这个想法。

干杯, 加里

2 个答案:

答案 0 :(得分:16)

Jon Skeet对单身人士有一个很好的article讨论这个问题。

答案 1 :(得分:2)

我建议您在Lazy<T>上阅读msdn,而不是滚动自己的线程安全延迟初始化程序并可能出错。

https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization#thread-safe-initialization