单身模式混乱

Pan*_*kaj 1 c#

按照单身模式,

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以上不是线程安全的.两个不同的线程都可以评估测试if(instance == null)并发现它是真的,然后两个都创建实例,这违反了单例模式.

混淆是实例是静态的,一旦在UI线程或其他线程上调用它,它是如何为null的?

编辑

我打算说,一旦我调用了Singleton.Instance.abc(); Singleton.Instance在手动处理之前不应为null.对?

rfm*_*tor 5

控制权传递给 ThreadA

ThreadA试图得到它Instance,它被发现了null.

控制权传递给 ThreadB

ThreadB试图得到它Instance,它被发现了null.

控制权传递给 ThreadA

ThreadA实例化Instance.

控制权传递给 ThreadB

ThreadB重新实例化Instance.

解决方案:您使用static构造函数来确保不会发生这种情况.