asp.net—单例模式
一、单例模式是什么?
定义:确保一个类仅仅能产生一个实例,并且提供一个全局访问点来获取该实例。
二、单例模式怎么用?
class SingleCase
{
public string Name{get;set;}
public static SingleCase mySingle = null;
public static object Flag = new object(); public static SingleCase getInstance(string name)
{
//判断是否实例化过
if(mySingle == null)
{
//进入lock
lock(Flag)
{
//判断是否实例化过
if(mySingle == null)
{
mySingle = new SingleCase();
mySingle.Name = name
}
}
}
return mySingle;
}
}
其实本人语言组织能力差,不太擅长写详细解析。不过既然有园友提议说多写写解析,那就在下献丑了。
单例模式的懒汉模式为什么用到两个判断一个锁?
这就需要根据代码一层一层来分析了(这些都是个人见解,不对的地方请谅解):
//其实如果只针对单线程而言,使用一个判断就可以
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)
{
//进入lock
lock(Flag)
{
//判断是否实例化过
if(mySingle == null)
{
mySingle = new SingleCase();
mySingle.Name = name
}
}
}
三、为什么用单例模式?
四、使用场景
- Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
- 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加
asp.net—单例模式的更多相关文章
- asp.net单例模式
目的:保证一个类只有一个单一的实例 好处:1.在资源共享的情况下,避免由多个操作而导致的资源消耗:2.提供可变数目的实例. 标准的单例代码如下: using System; using System. ...
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
ASP.NET MVC Filters 4种默认过滤器的使用[附示例] 过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...
- 在ASP.NET Web API中使用OData的单例模式
从OData v4开始增加了对单例模式的支持,我们不用每次根据主键等来获取某个EDM,就像在C#中使用单例模式一样.实现方式大致需要两步: 1.在需要实现单例模式的导航属性上加上[Singleton] ...
- asp.net中WinForm使用单例模式示例
例如在Windows应用程序中用下面代码打开一个窗体: 代码如下 复制代码 private void button1_Click(object sender, EventArgs e){ (new A ...
- Asp.Net 设计模式 之 “特殊”的单例模式
特殊的单例模式 要点在这里,提前预览: public SingleDemo() { name = "yy"; age = 20; //特殊的单例,this指代得失当前的Single ...
- Asp.Net 设计模式 之 单例模式
一.设计目的:让项目中只显示一个实例对象 二.设计步骤: 创建一个类: 构建类类型静态变量: 定义返回值类为单例类型的静态方法: 判断静态变量instance是否为空:如果为空,就创建实例,然后给单例 ...
- C#工具:ASP.NET MVC单例模式(懒汉)实现文件上传
1.SingletonConfigRead帮助类 using System; using System.Collections.Generic; using System.IO; using Syst ...
- ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法
在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...
- 学习ASP.NET Core, 怎能不了解请求处理管道[3]: 自定义一个服务器感受一下管道是如何监听、接收和响应请求的
我们在<服务器在管道中的"龙头"地位>中对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了介绍,为了让读者朋友们对管道中的服务器具有更 ...
随机推荐
- python的range函数与切片操作符
range(start,stop,step)参数含义:start:计数从start开始.默认是从0开始.例如range(5)等价于range(0, 5);end:计数到end结束,但不包括end.例如 ...
- Mo2C-tag
记者今天从中国科学院金属研究所获悉,该所沈阳材料科学国家(联合)实验室先进炭材料研究部任文才研究组在大尺寸高质量二维过渡族金属碳化物晶体的制备与物性研究方面取得了重要突破.相关成果日前在<自然— ...
- ECMAScript6新特性之继承
class Animal{ constructor(name){ this.name = name; } get name(){ return this._name; } set name(val){ ...
- 未能加载文件或程序集“AjaxControlToolkit”或它的某一个依赖项
对于这个问题,网上的解答都大同小异,最多的就是Bin文件夹下没有dll文件,引用路径问题.但我碰到的问题偏偏不是这个,而是没有一个人给出方法的问题.其实问题很简单,也很低级:IIS上发布网站的时候把整 ...
- 两数之和-数据结构设计 · Two Sum - Data structure design
[抄题]: 设计b并实现一个 TwoSum 类.他需要支持以下操作:add 和 find.add -把这个数添加到内部的数据结构.find -是否存在任意一对数字之和等于这个值 [思维问题]: 不知道 ...
- viewstamp replication: A new primary copy method to support highly-avaliable d
为了提高服务能力或者服务稳定,往往需要把数据重复布署,也就是replication.重复带来的问题是,更新的时候会带来不一致.一种比较简单的方法是,在N台重复的机器里选一台作为主机,其他作备份,只能通 ...
- 移动端 输入框 如果类型是number,用户也可以输入汉字和字母
<input type="number" id="input-age" placeholder="请输入你的年龄" /> //i ...
- 白盒静态自动化测试工具:FindBugs使用指南
目 录 1 FINDBUGS介绍 2 在ECLIPSE中安装FINDBUGS插件 3 在ECLIPSE中使用FINDBUGS操作步骤 3.1 ...
- 工作五年以上的 UI 设计师都在干什么?
30 岁,现在坐标北京,从毕业至今都一直在做设计.目前从业超过了五年,也没打算离开设计这个行业.即便有一天不再从事设计专职的岗位,也仍然会在生活中,或者一些份外的工作中做「设计师」的角色,因为设计已成 ...
- 利用HBuilder打包前端开发webapp为apk
转载 标签: apk / 打包 / vue 现在的前端开发可谓是,百花齐放啦,什么都可以做,只有想不到没有做不到的,今天就简单的介绍用vue,ng或者是react开发的单页应用如何打包为apk,在移动 ...