我们使用双重锁定实现了一个懒惰的单例,以确保实例仅是初始化的一次(而不是由于线程竞赛条件而不是两次)。
我想知道简单地使用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();
}
还可以根据应用程序的环境使用您喜欢的任何构造函数。