单例模式--C#

刚刚看设计模式,还不知道这些设计模式有什么做用,可是先记录下来,也许之后会用到!设计模式

单例模式:就是保证一个类只有一个实例的实现方法多线程

 

如,有一个构造函数,使外界不能建立该类的实例函数

private 这个类的类名()
{
  Console.Write("这是单例模式测试\n");
}测试

设置私有,保证它不能被外部实例化,线程

在当前类中创建一个静态变量用来保存这个类的实例设计

private static 这个类的类名 example;排序

再定义一个标识,后面用来加锁用到同步

private static readonly object locker = new object();it

这些变量和标识都设置为私有,已保证不能被外部调用class

 

以后就要创建一个公有的方法实例化这个类,外部经过调用这个公有的方法来获得这个类的实例

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

 

若是有多个线程同时运行到限制一,会同时经过限制一,这样的话就会就有多个线程同时运行到限制二,这些线程运行到限制二后,会进行一个小的“排序”,“排序”第一的线程经过限制二后,限制二就会自我封闭,直到“排序”第一的线程跑出限制二的范围,限制二才会继续容许其余“排序”的线程经过。这样,到限制三的时候,就只有一个“排序”第一的线程了,排序第一的线程顺利经过限制三,实例化类,跑出限制三,限制二。这里,刚才在等待的其余线程就会陆续经过限制二了,可是它们经过限制二也已经晚了,由于这个类已经被实例化过了,因此它们也就没法通限制三了,而直接输出被“排序”第一的线程实例化后的类实例,

相关文章
相关标签/搜索