/// <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;
}
}