/// <summary> /// test单例模式第一种 不考虑高并发的模式 /// </summary> public class singleton { //静态私有的字段为什么要static呢 因为为了被公开的方法GetInstance调用 为什么公开的方法GetInstance要被生命成static呢 因为如果不是静态的 外部根本就调用不到了这个方法 因为外部不能new 只能根据类名称调用里面的公开方法GetInstance private static singleton single; //私有的构造方法确保用户不能new出实例 private singleton() { } public static singleton GetInstance() { //首先判断是否有这个实例 如果没有 new一个新的实例 if (single == null) { single = new singleton();//为什么这里能new 因为构造函数是私有的private的 } //结果放回 return single; } } //上面的这个虽然能够解决类只能实例化一个对象的问题 但是当用户量访问量过大时 会出现创建出多个对象的问题,例如A过来以后 正在创建实例 此时实例还没有创建成功,B也过来创建实例 一看实例还是null 于是B创建了一个实例 此时A也创建出了实例 解决方法是加上lock锁 下面是lock锁的例子 public class singletonTwo { //静态的私有的字段 private static singletonTwo ST; //lock锁使用的私有静态对象 private static object _Object = new object(); //私有的构造方法 确保类的外部不能new private singletonTwo() { } //对外公开的实例化的静态方法 public static singletonTwo GetInstance() { //如果实例为空 在if的内层加lock锁 如果不为空 直接返回实例 if (ST == null)//这个循环主要是为了节省开销 如果每次每次进来都加把锁 再进行查看实例是否存在浪费资源 如果实例已经存在了 就不在需要锁机制 直接返回实例 { lock (_Object)//枷锁 { if (ST == null) { ST = new singletonTwo(); } } } return ST; } }