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 配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...
随机推荐
- ABP教程-给项目添加SwaggerUI,生成动态webapi
上一篇,我们是正式将ABP生成的代码项目,跑起来了,然后演示了下多租户的不同.那么这篇我们就来实现下SwaggerUI. Q:SwaggerUI是干什么的呢? A:他是一个能将我们的webapi,通过 ...
- PHP中多线程处理
php多进程处理 往往我们会碰到一个情况,需要写一个脚本,这个脚本要处理的数据量极大,单进程处理脚本非常慢,那么这个时候就会想到使用多进程或者多线程的方式了. 我习惯使用多进程的方式,php中使用多进 ...
- ActiveMQ5.14.1+Zookeeper3.4.9高可用伪分布式部署
本文借鉴http://www.cnblogs.com/gossip/p/5977489.html,在此基础上进行了完善,使之成为一个完整版的伪分布式部署说明,在此记录一下! 一.本文目的 ...
- TSQL 字符串函数:截断和查找
字符串截断函数是指:Stuff 和 SubString,字符串查找函数是:CharIndex 和 PatIndex 一,SubString 截取子串 最常用的字符串函数,用于截取特定长度的子串. SU ...
- JavaScript权威设计--JavaScript数组(简要学习笔记九)
1.数组的创建 如: var a=[1.1,null,"a"]; var b=[1, ,3]; //中间的那个元素是undefined var c=[ , , ] 这里c.leng ...
- MVC5 网站开发之四 业务逻辑层的架构和基本功能
业务逻辑层在Ninesky.Core中实现,主要功能封装一些方法通过调用数据存储层,向界面层提供服务. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 ...
- Mina、Netty、Twisted一起学(八):HTTP服务器
HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输. HTTP协议也是基于TCP协议,所以也有服务器和客户端.HTTP客户端一般是浏览器,当然还有可能是 ...
- Android数据加密之Aes加密
前言: 项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密,今天我们来认识一下aes加密. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes ...
- .NET MVC4 Razor视图预编译(一)
在平时使用.NET MVC中不乏有类似的需求:某些razor视图,特别是系统后台的视图,不想让用户自行更改,需要通过某种方法把视图模板编译到项目的dll中去. 但是VS并不提供razor的预编译,如果 ...
- TokuDB存储引擎
TokuDB是Tokutek公司开发的基于ft-index(Fractal Tree Index)键值对的存储引擎. 它使用索引加快查询速度,具有高扩展性,并支持hot scheme modifica ...