C#初学单例模式
版本1:最简单的单例模式
public class MySingleton
{
private MySingleton() //构造函数,注意private
{
}
private static MySingleton _Entity = null; //私有字段 public static MySingleton Entity //公共属性
{
get
{
if (_Entity == null) //确保只能创建一次对象
{
MySingleton._Entity = new MySingleton();
}
return MySingleton._Entity;
}
}
}
方法二:
public class MySingleton
{
private MySingleton() //构造函数,注意private
{
}
private static MySingleton _Entity = null; //私有字段 public static MySingleton GetEntity() //公有方法
{
if (_Entity == null) //确保只能创建一次对象
{
MySingleton._Entity = new MySingleton();
}
return MySingleton._Entity;
}
}
两点:1)保证所有构造函数不被外部所调用;2)利用属性或者方法调用对象。
缺点:无法保证线程的安全性,多个线程的情况下可能创建多个对象。
版本2:线程安全的单例模式
public class MySingleton
{
private MySingleton() //构造函数,注意private
{
} private static readonly object obj = new object();
private static MySingleton _Entity = null; //私有字段 public static MySingleton Entity //公共属性
{
get
{
lock (obj) //确保同一时刻,加锁的代码段只能被一个线程执行
{
if (_Entity == null) //确保只能创建一次对象
{
MySingleton._Entity = new MySingleton();
}
}
return MySingleton._Entity;
}
}
}
缺点:无论对象是否已经被创建,都要进行加锁,增加了不必要的开销。
版本3:Double-Checked Locking
public class MySingleton
{
private MySingleton() //构造函数,注意private
{
} private static readonly object obj = new object();
private static MySingleton _Entity = null; //私有字段 public static MySingleton Entity //公共属性
{
get
{
if (_Entity == null) //第一次检验,用于减少不必要的加锁
{
lock (obj) //确保同一时刻,加锁的代码段只能被一个线程执行
{
if (_Entity == null) //第二次检验,确保只能创建一次对象
{
MySingleton._Entity = new MySingleton();
}
}
}
return MySingleton._Entity;
}
}
}
这种方法既保证了线程的安全,又减少了加锁带来的不必要的开销
C#初学单例模式的更多相关文章
- 设计模式(一)单例模式(Singleton Pattern)
一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了 ...
- java开源项目之IQQ学习记录之单例模式与log4j日志记录
作者:sushengmiyan 本文地址:http://blog.csdn.net/sushengmiyan/article/details/18992741 打开IQQ项目,打开包iqq.app中的 ...
- 【C#设计模式1】单例模式
一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了 ...
- C#设计模式V2(1)——单例模式
出自:https://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计 ...
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- DDD初学指南
去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...
- 23种设计模式--单例模式-Singleton
一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- gulp初学
原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js 配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...
随机推荐
- dynamic-css 动态 CSS 库,使得你可以借助 MVVM 模式动态生成和更新 css,从 js 事件和 css 选择器的苦海中脱离出来
dynamic-css 使得你可以借助 MVVM 模式动态生成和更新 css,从而将本插件到来之前,打散.嵌套在 js 中的修改样式的代码剥离出来.比如你要做元素跟随鼠标移动,或者根据滚动条位置的变化 ...
- ASP.NET Web API 过滤器创建、执行过程(一)
ASP.NET Web API 过滤器创建.执行过程(一) 前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就 ...
- Top Coder算法题目浏览器
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/top-code-offline-browser/ 关于 左耳朵耗子 ...
- Windows.document
一.找到元素: document.getElementById("id");根据id找,最多找一个 var a =document.getElementById("id& ...
- C#中,双屏/两屏/三屏/多屏跳转判断
之前伤脑筋写过一次在Web中,JS,ActiveXObject去读取显示器数量.分辨率去判断单双屏跳转. 那么在客户端中,用C#去读取硬件信息,更方便更容易! 思路参考代码: ) { //此显示器是否 ...
- linux NFS 配置步骤
转载 http://woxihuanpes.blog.163.com/blog/static/12423219820097139145238/ NFS server可以看作是一个FILE SERVER ...
- 作为Coder的利器记载
工作近三年,使用PC快六年,拥抱Mac整一年,投具器石榴裙三年.14年第一次被同事推荐Everything,开启了JeffJade对工具的折腾之旅,并乐此不疲.时去两年,这必然是消耗了一些时间,但对效 ...
- Spark 生态系统组件
摘要: 随着大数据技术的发展,实时流计算.机器学习.图计算等领域成为较热的研究方向,而Spark作为大数据处理的“利器”有着较为成熟的生态圈,能够一站式解决类似场景的问题.那你知道Spark生态系统有 ...
- 使用topshelf包装redis为windows服务
Redis服务端目前用的是控制台程序运行,部署的时候能作为windows服务后台运行感觉更好.找到一篇文章Running Redis as a Windows Service,利用win ...
- 让DIV中文字换行显示
1. <style> div { white-space:normal; word-break:break-all; word-wrap:break-word; } </style& ...