什么是单例模式?

这里我就不做过多的解释了, 毕竟关于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# 单例模式的多种简单实现相关推荐

  1. android 弹窗有边框_Android 多种简单的弹出框样式设置代码

    简介 这是一个基于AlertDialog和Dialog这两个类封装的多种弹出框样式,其中提供各种简单样式的弹出框使用说明.同时也可自定义弹出框. 特性 1.使用链式开发代码简洁明了 2.所有的弹出框样 ...

  2. Android 多种简单的弹出框样式设置

    简介 这是一个基于AlertDialog和Dialog这两个类封装的多种弹出框样式,其中提供各种简单样式的弹出框使用说明.同时也可自定义弹出框. 项目地址:https://github.com/Liu ...

  3. android开发自动提示框,Android 多种简单的弹出框样式设置代码

    简介 这是一个基于AlertDialog和Dialog这两个类封装的多种弹出框样式,其中提供各种简单样式的弹出框使用说明.同时也可自定义弹出框. 项目地址:http://www.easck.com/j ...

  4. Java设计模式之单例模式(附简单案例)

    一.简单描述 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负 ...

  5. Caesar I (Crypto, Training) 的多种简单解法

    题目详情 As on most challenge sites, there are some beginner cryptos, and often you get started with the ...

  6. 【C++】C/C++ 中的单例模式

    目录 part 0:单例模式3种经典的实现方式 Meyer's Singleton Meyers Singleton版本二 Lazy Singleton Eager Singleton Testing ...

  7. 单例模式双重校验锁_被面试官虐过之后,他轻蔑的问我:你还说你了解单例模式吗?...

    单例,大家肯定都不陌生,这是Java中很重要的一个设计模式.其实单例模式看上去简单,实际上却有很多容易被忽视的地方,因为他涉及到一些线程安全的问题,稍不留神就可能入坑. 本文,就通过一次面试经历来深入 ...

  8. print python 如何加锁_深度解密Python单例模式

    相关代码已经上传至Github:Python_Development_Interview,大家可以收藏专题-Python的设计模式:解密+实战,之后会持续更新相关的设计模式. 1. 认识单例模式 认识 ...

  9. 以下哪个选项不是单例模式的优点_深度解密Python单例模式

    相关代码已经上传至Github:Python_Development_Interview,大家可以收藏专题-Python的设计模式:解密+实战,之后会持续更新相关的设计模式. 1. 认识单例模式 认识 ...

最新文章

  1. Nagios 监控实例部署
  2. DevExpress.GridControl.gridView的一些注意
  3. 在Nginx上配置多个站点
  4. CI在mimes.php添加对apk文件上传下载的支持
  5. Linux移植随笔:对tslib库的ts_test测试程序代码的一点分析
  6. html5画布作品,HTML5 canvas画布
  7. XSS漏洞原理/方式/防御
  8. android imageview scaletype 按钮状态,Android ImageView 之 ScaleType 详解
  9. 【Java爬虫】爬取淘宝买家秀
  10. 网络流(最大流)基础入门
  11. Excel筛选后填充
  12. windows 10 主题美化
  13. 关于C++ .h文件和.cpp文件的知识梳理
  14. html文档放到phpstudy,phpstudy使用详解
  15. 邮件该如何发送html代码
  16. html代码word,Web前端
  17. ngx-datatable的使用
  18. C#之Base64编码解码
  19. 手撸Spring系列4:IOC/DI 思想(实战篇)
  20. 期货交易的安全性分析

热门文章

  1. linux 编译opencv 慢,opencv4.0 cuda10 编译速度太慢
  2. Rumor CodeForces - 893C
  3. 在内存中读取函数的ShellCode并执行
  4. 从一百篇文章中总结出的需求分析四步法
  5. HDU Problem - 4292 Food(最大流, 建边)
  6. string 类的初始化和赋值(程序成长之路的一颗米)
  7. LintCode刷起来(一)
  8. [BUUCTF-pwn]——jarvisoj_test_your_memory
  9. 计算机操作系统——作业调度算法
  10. 关于优酷开放SDK之setOnLoadingStatusListener