一、单例模式是什么?

  定义:确保一个类仅仅能产生一个实例,并且提供一个全局访问点来获取该实例。

二、单例模式怎么用? 

 1 class SingleCase
 2 {
 3     public string Name{get;set;}
 4     public static SingleCase mySingle = null;
 5     public static object Flag = new object();
 6
 7     public static SingleCase getInstance(string name)
 8     {
 9         //判断是否实例化过
10         if(mySingle == null)
11         {
12             //进入lock
13             lock(Flag)
14             {
15                 //判断是否实例化过
16                 if(mySingle == null)
17                 {
18                     mySingle = new SingleCase();
19                     mySingle.Name = name
20                 }
21             }
22         }
23         return mySingle;
24     }
25 }

View Code

其实本人语言组织能力差,不太擅长写详细解析。不过既然有园友提议说多写写解析,那就在下献丑了。

单例模式的懒汉模式为什么用到两个判断一个锁?

这就需要根据代码一层一层来分析了(这些都是个人见解,不对的地方请谅解):

//其实如果只针对单线程而言,使用一个判断就可以
if(mySingle == null)
{mySingle = new SingleCase();mySingle.Name = name
}
//但是遇到多线程时候上面的代码就不能确保只产生一个实例了(这里多线程的概念就不做介绍了)
//所以这时候为了能够确保只产生一个实例,这里就使用了lock使线程同步(即同个时间段只允许一个线程执行)lock(Flag){//判断是否实例化过if(mySingle == null){mySingle = new SingleCase();mySingle.Name = name}                    }//经过上述代码应该就可以确保无论是单线程还是多线程都只能产生一个实例了,//那为什么在lock外面还需要再加一个判断呢?//这里有个多线程性能问题:因为lock的功能是使一个线程(A)通过,而让其他线程进入等待(A)线程执行完再执行。//那么如何优化呢?//只要有一个线程产生了一个实例,那后续其他线程不再需要进入lock//所以这就是lock外面还需要再加一个判断的原因//判断是否实例化过if(mySingle == null){//进入locklock(Flag){//判断是否实例化过if(mySingle == null){mySingle = new SingleCase();mySingle.Name = name}                    }}

三、为什么用单例模式?

对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;
一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;
如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。 
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。
这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。

四、使用场景

  1. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
  2. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加

转载于:https://www.cnblogs.com/witeem/p/10097910.html

asp.net—单例模式相关推荐

  1. 鸡肋的PHP单例模式

    单例模式的要点有三个: 一是某个类只能有一个实例: 二是它必须自行创建这个实例: 三是它必须自行向整个系统提供这个实例. <?php /* 单例模式举例,其要点如下: * * 1. $_inst ...

  2. NLog在Asp.Net MVC的实战应用

    Asp.Net MVC FilterAttribute特性.读取xml反序列化.NLog实战系列文章 注:如果你理解了AOP,那么看这篇文章的第三部分可能更轻松点: 如果你理解了单例模式和反射原理, ...

  3. [转]解读ASP.NET 5 MVC6系列(7):依赖注入

    本文转自:http://www.cnblogs.com/TomXu/p/4496440.html 在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Inject ...

  4. Asp.net SignalR 应用并实现群聊功能 开源代码

    ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...

  5. 一文读懂Asp.net core 依赖注入(Dependency injection)

    一.什么是依赖注入 首先在Asp.net core中是支持依赖注入软件设计模式,或者说依赖注入是asp.net core的核心: 依赖注入(DI)和控制反转(IOC)基本是一个意思,因为说起来谁都离不 ...

  6. 解读ASP.NET 5 MVC6系列(7):依赖注入

    原文:解读ASP.NET 5 & MVC6系列(7):依赖注入 在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Injection),ASP.NET ...

  7. [ASP.NET] Session的了解

    ASP.NET Session的使用当中我们会遇到很多的问题,那么这里我们来谈下经常出现的一些常用ASP.NET Session的理解: ASP.NET Session的七点认识之一 对于值类型的变量 ...

  8. ASP.NET MVC – 关于Action返回结果类型的事儿(上)

    本文转自:博客园-文超的技术博客 一.         ASP.NET MVC 1.0 Result 几何? Action的返回值类型到底有几个?咱们来数数看. ASP.NET MVC 1.0 目前一 ...

  9. 一步一步asp.net_页面静态化管理

    最近事情多,中间还生病了一次,纠结,最近一年来都没有什么毛病,不知道咋了...头痛..... 今天闲下来写篇日志,页面静态化. 页面静态化是我们经常碰到的问题,在web中,要说速度,只有html静态页 ...

  10. ASP.NET MVC 线程和并发

    我也想过跳过C#高级知识点概要直接讲MVC,但经过前思后想,还是觉得有必要讲的.我希望通过自己的经验给大家一些指引,带着大家一起走上ASP.NET MVC大牛之路,少走弯路.同时也希望能和大家一起交流 ...

最新文章

  1. Docker Cgroups
  2. python学习day-8 迭代器 生成器 装饰器
  3. Mac 从本地copy项目到服务器
  4. multi-CPU, multi-core and hyper-thread--转
  5. C++11中range-based for loops中与的区别
  6. 定时任务之crond服务
  7. 51Nod-1284 2 3 5 7的倍数【数位DP+记忆化搜索】
  8. SEO HTML语义化
  9. 解决办法:用户名不在 sudoers文件中 此事将被报告
  10. 【指纹识别】基于matlab GUI指纹识别【含Matlab源码 586期】
  11. linux设备驱动模型一字符设备open系统调用流程
  12. 超详细的Python实现新浪微博模拟登陆(小白都能懂)
  13. 关于双击此电脑、回收站、控制面板等提示找不到应用程序解决方案
  14. Unity Shader - GrabPass 实现武器热扭曲拖尾效果
  15. 碳纤维复合材料加工难点及铣削加工电主轴应用方案
  16. JXLS导出Excel表格实战教程
  17. matlab受力曲线导入adams中,如何在adams中导入dxf曲线
  18. 每日格言积累及总结——更新中
  19. 第二台计算机,世界上第二台电脑的名称是什么
  20. IntelliJ IDEA 工具技巧

热门文章

  1. 关于防止表单form重复提交的方式
  2. 黑科技:Wi-Fi热点智能垃圾桶现身纽约
  3. 不会日语也能在日本点菜 | 通用篇
  4. Windows 8实用窍门系列:16.Windows 8的右键菜单
  5. Redis与Mysql双写一致性方案解析
  6. npm构建vue项目
  7. Ubuntu18.04 关闭和开启图形界面
  8. bzoj4498: 魔法的碰撞
  9. java--DBUtils和连接池
  10. 剑指offer_两个链表的第一个公共结点