标签:
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
好处:1.保证唯一的实例 2.可以严格控制客户怎样访问它以及何时访问,即对唯一实例的受控访问
第一版:
class Singleton { private static Singleton instance; private Singleton() { } //构造方法让其private,堵死外界利用new创建此类实例的可能 public static Singleton GetInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
第二版:多线程时
class Singleton { private static Singleton instance; private static readonly object lockobj = new object();//因instance是否被创建不能确定,所以不能作为锁对象,需要重新声明一个静态只读对象 private Singleton() { } //构造方法让其private,堵死外界利用new创建此类实例的可能 public static Singleton GetInstance() { //同一时刻加了锁的那部分程序只有一个线程可以进入 lock (lockobj) { if (instance == null) { instance = new Singleton(); } } return instance; } }
第三版:双重锁定(因每次调用getinstance()方法都需要lock,会影响性能)
public sealed class Singleton //阻止派生类 { private static Singleton instance; private static readonly object lockobj = new object();//因instance是否被创建不能确定,所以不能作为锁对象,需要重新声明一个静态只读对象 private Singleton() { } //构造方法让其private,堵死外界利用new创建此类实例的可能 public static Singleton GetInstance() { if (instance == null)//先判断实例是否存在,不存在再进行加锁处理 { //同一时刻加了锁的那部分程序只有一个线程可以进入 lock (lockobj) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
第二个为null判断的原因:当instance=null并且同时有两个线程调用getinstance()方法时,他们可以通过第一重=null判断,然后由于lock机制只有一个进入,另一个在外排队等候。第一个完成之后,如果没有第二重=null操作,第二个线程还可以创建实例。
标签:
原文地址:http://www.cnblogs.com/luyujie/p/5581187.html