转自:http://www.techmango.com/blog/article/DotNet/Thread_Safe_Singleton_Instance.htm
许多同志都会采用一个double check的方式来创建一个Singleton:
public class Singleton
{
protected Singleton() { }
private static volatile Singleton instance = null;
/// Lazy方式创建唯一实例的过程
public static Singleton Instance()
{
if (instance == null) // 外层if
lock (typeof(Singleton)) // 多线程中共享资源同步
if (instance == null) // 内层if
instance = new Singleton();
return instance;
}
}
这应该是比较经典的线程安全的Singleton创建方式,但是还是一个更加简单也很Cool的线程安全的Singleton:
class Singleton
{
private Singleton() { }
public static readonly Singleton Instance = new Singleton();
}
它省去了上面示例中那个laze构造过程,由于Instance是类的公共静态成员,因此相当于它会在类第一次被用到的时候被构造,同样的原因也就可以省去把它放在静态构造函数里的过程。
这里实例构造函数被彻底定义为私有的,所以客户程序和子类无法额外构造新的实例,所有的访问通过公共静态成员Instance获得唯一实例的引用,符合Singleton的设计意图。