Lazy<T> 是线程安全的惰性加载单例的好解决方案吗?

Is Lazy<T> a good solution for a thread safe lazy loaded singleton?

我们在 get 上使用双重锁定实现了一个延迟加载的单例,以确保实例只初始化一次(而不是由于线程竞争条件而初始化两次)。

我想知道简单地使用 Lazy<T> 是否是解决这个问题的好方法?

I.E.

private static Lazy<MyClass> _instance = new Lazy<MyClass>(() => return new MyClass());

public static MyClass Instance
{
    get
    {
        return _instance.Value;
    }
}

我建议您阅读评论中的参考文章:

在所有情况下 Lazy<T> class 都是线程安全的,但你需要记住这种类型的 Value 可能是线程不安全的,并且可能在多线程环境:

private static Lazy<MyClass> _instance = new Lazy<MyClass>(() => return new MyClass());

public static MyClass Instance
{
   get {
      return _instance.Value;
   }
}

public void MyConsumerMethod()
{
    lock (Instance)
    {
        // this is safe usage
        Instance.SomeMethod();
    }

    // this can be unsafe operation
    Instance.SomeMethod();
}

您也可以根据应用程序的环境使用any constructor you like