asp.net—单例模式
一、单例模式是什么?
定义:确保一个类仅仅能产生一个实例,并且提供一个全局访问点来获取该实例。
二、单例模式怎么用?
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} }}
三、为什么用单例模式?
四、使用场景
- Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
- 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加
转载于:https://www.cnblogs.com/witeem/p/10097910.html
asp.net—单例模式相关推荐
- 鸡肋的PHP单例模式
单例模式的要点有三个: 一是某个类只能有一个实例: 二是它必须自行创建这个实例: 三是它必须自行向整个系统提供这个实例. <?php /* 单例模式举例,其要点如下: * * 1. $_inst ...
- NLog在Asp.Net MVC的实战应用
Asp.Net MVC FilterAttribute特性.读取xml反序列化.NLog实战系列文章 注:如果你理解了AOP,那么看这篇文章的第三部分可能更轻松点: 如果你理解了单例模式和反射原理, ...
- [转]解读ASP.NET 5 MVC6系列(7):依赖注入
本文转自:http://www.cnblogs.com/TomXu/p/4496440.html 在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Inject ...
- Asp.net SignalR 应用并实现群聊功能 开源代码
ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...
- 一文读懂Asp.net core 依赖注入(Dependency injection)
一.什么是依赖注入 首先在Asp.net core中是支持依赖注入软件设计模式,或者说依赖注入是asp.net core的核心: 依赖注入(DI)和控制反转(IOC)基本是一个意思,因为说起来谁都离不 ...
- 解读ASP.NET 5 MVC6系列(7):依赖注入
原文:解读ASP.NET 5 & MVC6系列(7):依赖注入 在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Injection),ASP.NET ...
- [ASP.NET] Session的了解
ASP.NET Session的使用当中我们会遇到很多的问题,那么这里我们来谈下经常出现的一些常用ASP.NET Session的理解: ASP.NET Session的七点认识之一 对于值类型的变量 ...
- ASP.NET MVC – 关于Action返回结果类型的事儿(上)
本文转自:博客园-文超的技术博客 一. ASP.NET MVC 1.0 Result 几何? Action的返回值类型到底有几个?咱们来数数看. ASP.NET MVC 1.0 目前一 ...
- 一步一步asp.net_页面静态化管理
最近事情多,中间还生病了一次,纠结,最近一年来都没有什么毛病,不知道咋了...头痛..... 今天闲下来写篇日志,页面静态化. 页面静态化是我们经常碰到的问题,在web中,要说速度,只有html静态页 ...
- ASP.NET MVC 线程和并发
我也想过跳过C#高级知识点概要直接讲MVC,但经过前思后想,还是觉得有必要讲的.我希望通过自己的经验给大家一些指引,带着大家一起走上ASP.NET MVC大牛之路,少走弯路.同时也希望能和大家一起交流 ...
最新文章
- Docker Cgroups
- python学习day-8 迭代器 生成器 装饰器
- Mac 从本地copy项目到服务器
- multi-CPU, multi-core and hyper-thread--转
- C++11中range-based for loops中与的区别
- 定时任务之crond服务
- 51Nod-1284 2 3 5 7的倍数【数位DP+记忆化搜索】
- SEO HTML语义化
- 解决办法:用户名不在 sudoers文件中 此事将被报告
- 【指纹识别】基于matlab GUI指纹识别【含Matlab源码 586期】
- linux设备驱动模型一字符设备open系统调用流程
- 超详细的Python实现新浪微博模拟登陆(小白都能懂)
- 关于双击此电脑、回收站、控制面板等提示找不到应用程序解决方案
- Unity Shader - GrabPass 实现武器热扭曲拖尾效果
- 碳纤维复合材料加工难点及铣削加工电主轴应用方案
- JXLS导出Excel表格实战教程
- matlab受力曲线导入adams中,如何在adams中导入dxf曲线
- 每日格言积累及总结——更新中
- 第二台计算机,世界上第二台电脑的名称是什么
- IntelliJ IDEA 工具技巧