按照单例模式,
public sealed class Singleton
{
static Singleton instance=null;
Singleton()
{
}
public void abc(){
}
public static Singleton Instance
{
get
{
if (instance==null)
{
instance = new Singleton();
}
return instance;
}
}
}
上面的方法不是线程安全的。两个不同的线程都可以评估测试if(instance == null)并发现它为true,然后都创建实例,这违反了单例模式。
混乱是Instance是静态的,一旦在UI线程或其他线程上调用Instance,它怎么可能为null?
编辑
我的意思是说一旦我调用Singleton.Instance.abc();
Singleton.Instance在手动处理之前不应为null。对?
最佳答案
控制权传递给ThreadA
ThreadA
尝试获取Instance
,发现它是null
。
控制权传递给ThreadB
ThreadB
尝试获取Instance
,发现它是null
。
控制权传递给ThreadA
ThreadA
实例化Instance
。
控制权传递给ThreadB
ThreadB
重新实例化Instance
。
解决方案:您使用static
构造函数来确保不会发生这种情况。
关于c# - 单例模式困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8629229/