按照单身模式,
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.对?
控制权传递给 ThreadA
ThreadA
试图得到它Instance
,它被发现了null
.
控制权传递给 ThreadB
ThreadB
试图得到它Instance
,它被发现了null
.
控制权传递给 ThreadA
ThreadA
实例化Instance
.
控制权传递给 ThreadB
ThreadB
重新实例化Instance
.
解决方案:您使用static
构造函数来确保不会发生这种情况.
归档时间: |
|
查看次数: |
277 次 |
最近记录: |