【发布时间】:2019-03-27 02:31:52
【问题描述】:
试图了解何时锁定静态变量被认为是最佳实践。静态实例设置器是线程安全的吗?如果不是,应该是,为什么(不使其成为线程安全的后果是什么)?
class MyClass
{
private static MyClass _instance;
private static readonly object _padlock = new object();
public static MyClass Instance
{
get
{
if(_instance == null)
{
lock(_padlock)
{
if(_instance == null)
{
_instance = new MyClass();
}
}
}
return _instance;
}
set => _instance = value;
}
}
【问题讨论】:
-
为什么要有二传手?是否可以在某个时候将
MyClass替换为新的? -
正确。它将用作我正在实现工厂类的环境上下文模式的一部分。我看不出锁定它的理由,但它似乎也不是线程安全的。
-
我建议将 setter 隐藏在一个单独的适当命名的方法后面,以阻止随机分配,因为可能会发生这种情况。也不,它不是线程安全的。
-
我同意它不是线程安全的,但原子分配让我很困惑。感谢大家的帮助。
标签: c# multithreading thread-safety