C# 单例模式的多种简单实现
什么是单例模式?
这里我就不做过多的解释了, 毕竟关于Singleton的资料实在是太多太多了。点击这里
1.简单的思路就是, 创建对象单例的动作转移到另外的行为上面, 利用一个行为去创建对象自身, 如下:
public class Singleton{private static Singleton _Singleton = null;public static Singleton CreateInstance(){if (_Singleton == null){ Console.WriteLine("被创建");_Singleton = new Singleton();}return _Singleton;}}
这样写看上去是没有问题, 但是有没有那种可能, 同时两个动作都判断这个对象为空, 那么这个对象就会被创建2次?是的, 多线程中, 这样是无法保证单例。
就像这样, 同时创建多个线程去创建这个对象实例的时候, 会被多次创建, 这个时候, 对代码改进一下。
public class Singleton{private static Singleton _Singleton = null;private static object Singleton_Lock = new object(); //锁同步public static Singleton CreateInstance(){lock (Singleton_Lock){ Console.WriteLine("路过");if (_Singleton == null){ Console.WriteLine("被创建");_Singleton = new Singleton();}}return _Singleton;}}
调试代码:
TaskFactory taskFactory = new TaskFactory();List<Task> taskList = new List<Task>();for (int i = 0; i < 5; i++){taskList.Add(taskFactory.StartNew(() =>{Singleton singleton = Singleton.CreateInstance(); }));}
结果:
上面, 我们创建了多个线程,同时去创建这个对象的实例, 在第二次,对象命名已经被创建了, 尽管只创建了一次满足了我们的需求, 但是我们已知对象被创建了, 还需要进来做不必要的动作吗?
我们都知道, 同步锁为了达到预期的效果, 也是损耗了性能的, 那么下面的输出, 很显然是没必要的动作, 所以我们优化一下。
public class Singleton{private static Singleton _Singleton = null;private static object Singleton_Lock = new object();public static Singleton CreateInstance(){if (_Singleton == null) //双if +lock {lock (Singleton_Lock){Console.WriteLine("路过。");if (_Singleton == null){Console.WriteLine("被创建。");_Singleton = new Singleton();}}}return _Singleton;}}
结果:
很显然, 这样达到了我们的预期, 对象在被创建后, 就没必要做多余的行为。
利用静态变量实现单例模式
public class SingletonThird{/// <summary>/// 静态变量/// </summary>private static SingletonThird _SingletonThird = new SingletonThird();public static SingletonThird CreateInstance(){return _SingletonThird;}}
是不是觉得很优雅, 利用静态变量去实现单例, 由CLR保证,在程序第一次使用该类之前被调用,而且只调用一次
PS: 但是他的缺点也很明显, 在程序初始化后, 静态对象就被CLR构造了, 哪怕你没用。
利用静态构造函数实现单例模式
public class SingletonSecond{private static SingletonSecond _SingletonSecond = null; static SingletonSecond(){ _SingletonSecond = new SingletonSecond();}public static SingletonSecond CreateInstance(){return _SingletonSecond;}}
静态构造函数:只能有一个,无参数的,程序无法调用 。
同样是由CLR保证,在程序第一次使用该类之前被调用,而且只调用一次
同静态变量一样, 它会随着程序运行, 就被实例化, 同静态变量一个道理。
转载于:https://www.cnblogs.com/zh7791/p/7930342.html
C# 单例模式的多种简单实现相关推荐
- android 弹窗有边框_Android 多种简单的弹出框样式设置代码
简介 这是一个基于AlertDialog和Dialog这两个类封装的多种弹出框样式,其中提供各种简单样式的弹出框使用说明.同时也可自定义弹出框. 特性 1.使用链式开发代码简洁明了 2.所有的弹出框样 ...
- Android 多种简单的弹出框样式设置
简介 这是一个基于AlertDialog和Dialog这两个类封装的多种弹出框样式,其中提供各种简单样式的弹出框使用说明.同时也可自定义弹出框. 项目地址:https://github.com/Liu ...
- android开发自动提示框,Android 多种简单的弹出框样式设置代码
简介 这是一个基于AlertDialog和Dialog这两个类封装的多种弹出框样式,其中提供各种简单样式的弹出框使用说明.同时也可自定义弹出框. 项目地址:http://www.easck.com/j ...
- Java设计模式之单例模式(附简单案例)
一.简单描述 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负 ...
- Caesar I (Crypto, Training) 的多种简单解法
题目详情 As on most challenge sites, there are some beginner cryptos, and often you get started with the ...
- 【C++】C/C++ 中的单例模式
目录 part 0:单例模式3种经典的实现方式 Meyer's Singleton Meyers Singleton版本二 Lazy Singleton Eager Singleton Testing ...
- 单例模式双重校验锁_被面试官虐过之后,他轻蔑的问我:你还说你了解单例模式吗?...
单例,大家肯定都不陌生,这是Java中很重要的一个设计模式.其实单例模式看上去简单,实际上却有很多容易被忽视的地方,因为他涉及到一些线程安全的问题,稍不留神就可能入坑. 本文,就通过一次面试经历来深入 ...
- print python 如何加锁_深度解密Python单例模式
相关代码已经上传至Github:Python_Development_Interview,大家可以收藏专题-Python的设计模式:解密+实战,之后会持续更新相关的设计模式. 1. 认识单例模式 认识 ...
- 以下哪个选项不是单例模式的优点_深度解密Python单例模式
相关代码已经上传至Github:Python_Development_Interview,大家可以收藏专题-Python的设计模式:解密+实战,之后会持续更新相关的设计模式. 1. 认识单例模式 认识 ...
最新文章
- Nagios 监控实例部署
- DevExpress.GridControl.gridView的一些注意
- 在Nginx上配置多个站点
- CI在mimes.php添加对apk文件上传下载的支持
- Linux移植随笔:对tslib库的ts_test测试程序代码的一点分析
- html5画布作品,HTML5 canvas画布
- XSS漏洞原理/方式/防御
- android imageview scaletype 按钮状态,Android ImageView 之 ScaleType 详解
- 【Java爬虫】爬取淘宝买家秀
- 网络流(最大流)基础入门
- Excel筛选后填充
- windows 10 主题美化
- 关于C++ .h文件和.cpp文件的知识梳理
- html文档放到phpstudy,phpstudy使用详解
- 邮件该如何发送html代码
- html代码word,Web前端
- ngx-datatable的使用
- C#之Base64编码解码
- 手撸Spring系列4:IOC/DI 思想(实战篇)
- 期货交易的安全性分析
热门文章
- linux 编译opencv 慢,opencv4.0 cuda10 编译速度太慢
- Rumor CodeForces - 893C
- 在内存中读取函数的ShellCode并执行
- 从一百篇文章中总结出的需求分析四步法
- HDU Problem - 4292 Food(最大流, 建边)
- string 类的初始化和赋值(程序成长之路的一颗米)
- LintCode刷起来(一)
- [BUUCTF-pwn]——jarvisoj_test_your_memory
- 计算机操作系统——作业调度算法
- 关于优酷开放SDK之setOnLoadingStatusListener