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。
我们在 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。