码迷,mamicode.com
首页 > Windows程序 > 详细

单例模式--C#

时间:2015-05-08 21:48:07      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

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

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

 

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

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

 

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

单例模式--C#

标签:

原文地址:http://www.cnblogs.com/Struggle-Hard/p/4488788.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!