你的位置:首页 > ASP.net教程

[ASP.net教程]单例模式和多线程有没有关系?


单例模式解决的问题:保证一个类仅有一个实例,并提供一个访问它的全局访问点

 
 
多线程时双重锁定的单例模式:
  1. class Singletion
  2.     {
  3.         private static Singletion instance;
  4.         private static readonly object syncRoot = new object();
  5.         private Singletion() { }
  6.         public static Singletion GetInstan()
  7.         {
  8.             if (instance == null)
  9.             {
  10.                 lock (syncRoot)
  11.                 {
  12.                     if (instance == null)
  13.                     {
  14.                         instance = new Singletion();
  15.                     }
  16.                 }
  17.             }
  18.             return instance;
  19.         }
  20.     }

为什么有两处if(instance==null)?   --当为null时并且同时有2个线程调用GetInstan()时,它们将都可以通过第一重的判断,然后由于lock机制,一个线程进入排队,当第一个线程出来后如果没有第二层判断将重新创建
 
 
静态化下多线程时的单利模式:
    /// <summary>
    /// sealed修饰符可以应用于类、实例方法和属性。密封类不能被继承
    /// </summary>
  1.     public sealed class Singletion
  2.     {
  3.         private static readonly Singletion instance = new Singletion();
  4.         private Singletion() { }
  5.         public static Singletion GetInstan()
  6.         {
  7.             return instance;
  8.         }
  9.     }

 这样写依赖于公共语言运行库来初始化变量,由于构造函数是私有的所以不能在类本身以外实例化Singletion类;因此变量的引用的是可以在系统中存在的唯一实例。这种方式是在自己被加载时就将自己实例化,所以被称为饿汉式单利模式;原先的要在第一次被引用时才会将自己实例化被称为懒汉示