按照单例模式,

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/

10-11 23:05
查看更多