静态构造函数和Singleton类

Gar*_*yJL 21 c# singleton static multithreading

我有一个实现Singleton设计模式的对象缓存.我对单例的方法总是在首次访问属性时延迟加载静态实例.

public static Widget
{
    get
    {
        if(instance==null) instance = new Widget();
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我知道这种方法不是线程安全的,并且实例检查为null会导致效率低下.在实例化静态实例的类上实现静态构造函数是否明智?

据我所知,只要第一次静态属性访问发生,就会调用静态构造函数.这是否有效,它是否会提供超过当前延迟加载方法的任何好处,或者更好地探索代理实现,还是使用锁来强制它是线程安全的?

public static Widget
    {
        get
        {
            if(instance==null)
            {
                lock(padlock)
                {
                    if(instance==null) instance = new Widget();
                }
            }
            return instance;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

干杯,加里

jas*_*son 16

Jon Skeet有一篇很好的关于单身人士讨论这个问题的文章.