单例模式
一、单例模式
目的:创建唯一实例
class Singleton { private static Singleton instance; //私有静态类变量 //主动创建私有的构造方法,这样就堵死了外界利用new创建此类实例的可能 private Singleton() { } //此方法是获得本类实例的唯一全局访问点 pulic static Singleton GetInstance() { if(instance==null) { instance=new Singleton(); } return instance; } }
二、多线程时的单例
lock确保当一个县城位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则他将一直等待,直到对象被释放。
class Singleton { private static Singleton instance; private static readonly Object syncRoot=new Object(); //程序运行时创建一个静态只读的进程辅助对象 private Singleton() { } pulic static Singleton GetInstance() { lock(syncRoot) //在同一时刻加了锁的那部分代码只有一个线程可以进入 { if(instance==null) { instance=new Singleton(); } } return instance; } }
三、双重锁定
class Singleton { private static Singleton instance; private static readonly Object syncRoot=new Object(); private Singleton() { } pulic static Singleton GetInstance() { if(instance==null) //先判断实例是否存在,不存在再加锁处理 { lock(syncRoot) { if(instance==null) { instance=new Singleton(); } } } return instance; }
对于instance存在的情况,就直接返回。当instance为null并且同时又两个线程调用GetInstance()方法时,他们将都可以通过第一重instance==null的判断。然后由于lock机制,这连个线程则只有一个进入,另一个在外排队等候,必须要其中的一个进入并出来后,另一个才能进入。而此时如果没有了第二重的instance是否为null的判断,则第一个线程创建了实例,而第二个线程还是可以继续再创建新的实例,这就没有达到单例的目的。