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



我们使用双重锁定实现了一个懒惰的单例,以确保实例仅是初始化的一次(而不是由于线程竞赛条件而不是两次)。

我想知道简单地使用Lazy<T>是解决此问题的好解决方案吗?

即。

private static Lazy<MyClass> _instance = new Lazy<MyClass>(() => return new MyClass());
public static MyClass Instance
{
    get
    {
        return _instance.Value;
    }
}

我建议您从评论中阅读引用文章:

  • 懒惰班
  • 在C#
  • 中实现单例模式

在所有情况下,Lazy<T>类都是线程安全,但是您需要记住,此类型的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();
}

还可以根据应用程序的环境使用您喜欢的任何构造函数。

最新更新