标签:
刚刚看设计模式,还不知道这些设计模式有什么作用,但是先记录下来,也许以后会用到!
单例模式:就是保证一个类只有一个实例的实现方法
如,有一个构造函数,使外界不能创建该类的实例
private 这个类的类名()
{
Console.Write("这是单例模式测试\n");
}
设置私有,保证它不能被外部实例化,
在当前类中建立一个静态变量用来保存这个类的实例
private static 这个类的类名 example;
再定义一个标识,后面用来加锁用到
private static readonly object locker = new object();
这些变量和标识都设置为私有,已保证不能被外部调用
之后就要建立一个公有的方法实例化这个类,外部通过调用这个公有的方法来得到这个类的实例
public static 这个类的类名 GetInstance()
1.判断这个类是否实例化
if(example==null)
2.锁住locker,是得locker被锁期间不被执行里面的方法
lock (locker)
3.再次判断类是否被实例化
if(example==null)
4.实例化这个类
example= new Singleton();
5.最后输出这个类的实例
return example;
得到完整代码
public class Singleton
{
//定义一个静态变量来保存类的实例
private static Singleton example;
//定义一个标识确保线程同步
private static readonly object locker = new object();
//定义私有构造函数,使外界不能创建该类的实例
private Singleton()
{
Console.Write("这是单例模式测试\n");
}
/// <summary>
/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
//多线程同时运行到这里,会同时通过这个判断条件执行条件内的代码
if (example== null)//限制一
{
//多线程同时运行到这里后,只能有一个线程通过lock锁,其他线程会被挂起
lock (locker)//限制二
{
// 再次判断如果类的实例是否创建,如果不存在则实例化,反之就直接输出类的实例
if (example== null)限制三
{
example= new Singleton();
}
}
}
return example;
}
}
如果有多个线程同时运行到限制一,会同时通过限制一,这样的话就会就有多个线程同时运行到限制二,这些线程运行到限制二后,会进行一个小的“排序”,“排序”第一的线程通过限制二后,限制二就会自我封闭,直到“排序”第一的线程跑出限制二的范围,限制二才会继续允许其他“排序”的线程通过。这样,到限制三的时候,就只有一个“排序”第一的线程了,排序第一的线程顺利通过限制三,实例化类,跑出限制三,限制二。这里,刚才在等待的其他线程就会陆续通过限制二了,但是它们通过限制二也已经晚了,因为这个类已经被实例化过了,所以它们也就无法通限制三了,而直接输出被“排序”第一的线程实例化后的类实例,
标签:
原文地址:http://www.cnblogs.com/Struggle-Hard/p/4488788.html