单例模式和多线程有没有关系?
单例模式解决的问题:保证一个类仅有一个实例,并提供一个访问它的全局访问点
多线程时双重锁定的单例模式:
- class Singletion
- {
- private static Singletion instance;
- private static readonly object syncRoot = new object();
- private Singletion() { }
- public static Singletion GetInstan()
- {
- if (instance == null)
- {
- lock (syncRoot)
- {
- if (instance == null)
- {
- instance = new Singletion();
- }
- }
- }
- return instance;
- }
- }
为什么有两处if(instance==null)? --当为null时并且同时有2个线程调用GetInstan()时,它们将都可以通过第一重的判断,然后由于lock机制,一个线程进入排队,当第一个线程出来后如果没有第二层判断将重新创建
静态化下多线程时的单利模式:
/// <summary>
/// sealed修饰符可以应用于类、实例方法和属性。密封类不能被继承
/// </summary>
/// sealed修饰符可以应用于类、实例方法和属性。密封类不能被继承
/// </summary>
- public sealed class Singletion
- {
- private static readonly Singletion instance = new Singletion();
- private Singletion() { }
- public static Singletion GetInstan()
- {
- return instance;
- }
- }
这样写依赖于公共语言运行库来初始化变量,由于构造函数是私有的所以不能在类本身以外实例化Singletion类;因此变量的引用的是可以在系统中存在的唯一实例。这种方式是在自己被加载时就将自己实例化,所以被称为饿汉式单利模式;原先的要在第一次被引用时才会将自己实例化被称为懒汉示
作者:大胖儿在努力
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。