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#浅析单例模式的更多相关文章
- 浅析Javascript单例模式
定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点 .就想我们在开发中有些对象只需要一个,例如window对象. 1. 实现单例模式 var Singleton = function( nam ...
- IOS设计模式浅析之单例模式(Singleton)
说在前面 进入正式的设计模式交流之前,扯点闲话.我们在项目开发的过程中,经常会不经意的使用一些常见的设计模式,如单例模式.工厂方法模式.观察者模式等,以前做.NET开发的时候,认真拜读了一下程杰老师的 ...
- 浅析Struts1和Struts2的Action线程安全问题 转
浅析Struts1和Struts2的Action线程安全问题 转 http://blog.csdn.net/virgoboy2004/article/details/5876133 [问题描述]最近 ...
- CAS、原子操作类的应用与浅析及Java8对其的优化
前几天刷朋友圈的时候,看到一段话:如果现在我是傻逼,那么我现在不管怎么努力,也还是傻逼,因为我现在的傻逼是由以前决定的,现在努力,是为了让以后的自己不再傻逼.话糙理不糙,如果妄想现在努力一下,马上就不 ...
- headfirst设计模式(6)—单例模式
前言 这一章的课题看起来就很和蔼可亲了,比起前面绕的我不要不要的工厂模式,那感觉真是太好了,但是正是因为简单,那么问题就来了,我怎么才能把这个东西叙述清楚?怎么样才能老少咸宜呢? 如何能够在把这个东西 ...
- 大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC
转发时请注明原创作者及地址,否则追究责任.原创:alunchen 在上一篇文章中,我们聊了很多关于定义的方面,比较孤燥,下面我们结合.Net Core聊一下依赖注入&控制反转. 三种对象生 ...
- 消息队列——ActiveMQ使用及原理浅析
文章目录 引言 正文 一.ActiveMQ是如何产生的? 产生背景 JMS规范 基本概念 JMS体系结构 二.如何使用? 基本功能 消息传递 P2P pub/sub 持久订阅 消息传递的可靠性 事务型 ...
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- SQL Server on Linux 理由浅析
SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...
随机推荐
- Redis系列-好玩的用法
分布式锁 客户端执行如下命令,来获取锁和释放锁. random = random() ok = (Set key random PX 2000ms NX) if (ok) { //do somethi ...
- 《第一本docker书》—— 读后总结
关于docker 这本书其实并没有读完,只不过最近工作比较繁忙,也无心再看这些用不到的书.以后要是工作需要,再仔细学习吧. 这次的阅读算是达到目的了,对docker有了一定的了解.它的作用.意义以及大 ...
- C#设计模式-外观模式
在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“模 ...
- 搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展
上一篇:搭建LNAMP环境(五)- PHP7源码安装Redis和Redis拓展 一.安装MongoDB 1.创建mongodb用户组和用户 groupadd mongodb useradd -r -g ...
- java 成长之路
分享总结 title: java 成长之路 tags: grammar_cjkRuby: true 经验差异 1-3年 要求 建议 3-5年 建议 5年+ 经验差异 最近一年比较忙,经历了创业公司的倒 ...
- Security8:删除Role 和 User
数据库的Role 和 User都是基于Specified DB的,在删除这些Principal之前,必须使用Use clause,切换到指定的DB中. sys.database_role_member ...
- 前端学PHP之数据类型
× 目录 [1]总括 [2]布尔型 [3]整型[4]浮点型[5]字符串[6]数组[7]对象[8]NULL[9]资源 前面的话 同javascript一样,php也是一门弱类型语言,或者说成类型松散的语 ...
- 深入学习jQuery事件绑定
× 目录 [1]bind [2]trigger [3]delegate[4]on[5]one 前面的话 javascript有HTML.DOM0级.DOM2级和IE这四种事件处理程序,而jQuery对 ...
- 关于MVC EF架构及Repository模式的一点心得
一直都想写博客,可惜真的太懒了或者对自己的描述水平不太自信,所以...一直都是不想写的状态,关于领域驱动的东西看了不少,但是由于自己水平太差加上工作中实在用不到,所以一直处于搁置状态,最近心血来潮突然 ...
- [c++] Smart Pointers
内存管理方面的知识 基础实例: #include <iostream> #include <stack> #include <memory> using names ...