using System;
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
我不明白为什么要双重检查!我读到这个双重检查是为了解决线程并发问题 - 但是......
锁会解决它 - 那么为什么我们需要先“如果”
如果这个单例没有第一个'if',它仍然是线程安全的——对吗?
如果第一个 'if' 为 false - 那么 thread1 将初始化 'instance' 对象 => 现在,'instance' 不为 null 并且 thread1 仍在锁定块中 ===>> 现在,thread2 检查第一个' if' 并且会得到 false => 所以他不会到达'lock' 并且很快就会返回实例,并且 thread2 能够更改 'instance' => 所以 thread1 && thread2 在同一个'instance'上'工作' ' object => 那么线程安全在哪里......或者我在这里缺少什么。