把构造函数设为私有函数以禁止他人建立。定义一个静态实例,在须要的时候建立该实例。c#
1 public sealed class Singleton1 2 { 3 //私有方法建立Singleton1 4 private Singleton1(){ 5 } 6 7 private static Singleton1 instance = null; 8 public static Singleton1 Instance 9 { 10 get{ 11 if(instance == null) 12 instance = new Singleton1(); 13 14 return instance; 15 } 16 } 17 }
只适合单线程,若是多线程同时运行到判断语句,会建立多个实例。多线程
对第一种方法的改进,能够经过添加一个同步锁。函数
public sealed class Singleton2 { //私有方法建立Singleton2 private Singleton2(){ } private static readonly object syncObj = new object(); private static Singleton2 instance = null; public static Singleton2 Instance { get{ lock(syncObj){ if(instance == null) instance = new Singleton2(); } return instance; } } }
此时只有一个线程能够获得同步锁。其余的线程只能等待,等第一个线程执行完建立实例或获得实例后,其余线程再依次进行得到同步锁和判断。spa
第二种方法在每次线程都会执行同步锁,而同步锁是一个效率很低费时间的操做,因此要避免加锁操做。
咱们在实例尚未建立前须要加锁,以后就不须要加锁操做了,进一步改进以下:线程
public sealed class Singleton3 { //私有方法建立Singleton3 private Singleton3(){ } private static readonly object syncObj = new object(); private static Singleton3 instance = null; public static Singleton3 Instance { get { if(instance == null) { lock(syncObj){ if(instance == null) instance = new Singleton3(); } return instance; } } } }
在c#中,静态构造函数只会被调用一次。能够利用这一特性进行单例模式。code
public sealed class Singleton4 { private Singleton4(){ } private static Singleton4 instance = new Singleton4(); public static Singleton4 Instance { get{ return instance; } } }
public sealed class Singleton5 { Singleton5(){ } public static Singleton5 Instance{ get{ return Nested.instance; } } class Nested { static Nested(){ } internal static readonly Singleton5 instance = new Singleton5(); } }