版本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#初学单例模式的更多相关文章

  1. 设计模式(一)单例模式(Singleton Pattern)

    一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了 ...

  2. java开源项目之IQQ学习记录之单例模式与log4j日志记录

    作者:sushengmiyan 本文地址:http://blog.csdn.net/sushengmiyan/article/details/18992741 打开IQQ项目,打开包iqq.app中的 ...

  3. 【C#设计模式1】单例模式

    一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了 ...

  4. C#设计模式V2(1)——单例模式

    出自:https://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计 ...

  5. C++实现线程安全的单例模式

    在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...

  6. DDD初学指南

    去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...

  7. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  8. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  9. gulp初学

    原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js  配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...

随机推荐

  1. Kinect开发文章目录

    整理了一下去年为止到现在写的和翻译的Kinect的相关文章,方便大家查看.另外,最近京东上微软在搞活动, 微软 Kinect for Windows 京东十周年专供礼包 ,如果您想从事Kinect开发 ...

  2. 解决CSharpGL使用CGCompiler时发现的几个问题

    解决CSharpGL使用CGCompiler时发现的几个问题 为了获取CSharpShadingLanguage的token流,我设计了这样一个文法: <Expression> ::= & ...

  3. 包含LOB_Data列的表删除大量数据后表及数据库文件的收缩

    最近有一张表(内含varchar(max)字段),占用空间达到240G,删除历史数据后几十万条后,空间并未得到释放. 然后用DBCC CLEANTABLE(0,tb_name,100)来释放删除记录后 ...

  4. 单选按钮加confirm进行判断返回false任被选中问题

    <html> <head> <script language="javascript"> var checkValue = "&quo ...

  5. 初始Bootstrap

    使用示例 ①下载Bootstrap框架 网址:http://v3.bootcss.com/getting-started/#download ②解压得到三个文件     ③将文件添加进项目后,在页面中 ...

  6. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③

    系列目录 上一节我们讲了如何捕获异常和记录日志,这一节我们讲,没有捕获的或者忘记捕获的异常包括404错误等,我们统一处理这个异常. 这一讲是利用 Application_Error 捕获所有异常,全局 ...

  7. K近邻法(KNN)原理小结

    K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...

  8. sql重置自增长

    SQL的自增列挺好用,只是开发过程中一旦删除数据,标识列就不连续了 写起来 也很郁闷,所以查阅了一下标识列重置的方法 发现可以分为三种: --- 删除原表数据,并重置自增列 truncate tabl ...

  9. CentOS7使用firewalld打开关闭防火墙与端口

    1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld  停止: systemctl disab ...

  10. 探究负边距(negative margin)原理

    W3C规范在介绍margin时有这样一句话: Negative values for margin properties are allowed, but there may be implement ...