一、单例模式简介

单例模式是为保证一个对象,在程序运行的任何时刻只有一个实例存在,我们把这种实现方式称之为“单例模式”。

二、单例模式的核心

单例类只有一个实例存在

单例类提供一个全局访问点

单例类通过自己创建唯一实例

单例类对外所有访问对象都提供一个唯一实例。

三、单例模式的优点

1、在程序运行中只有一个实例,减少内存占用,减少频繁的创建和销毁实例所带来的系统开销,

2、避免资源的多种无效占用

单例模式缺点:

没有接口 不能继承

四、单例模式应用场景

当一个事物在特定的环境中,只会存在一个实例时,我们可以采用单例模式对其进行设计。

例: 数据库连接池,计算机注册表 一个国家只有一个总统 日志系统中的日志文件 计算机中的打印池 计算机设备管理器

生成唯一序列号 网站计数器

五、单例模式的实现方式

1、非线程安全(尽量不要用)

public sealed class Singleton

{

private static Singleton instance=null;

private Singleton()

{

}

public static Singleton Instance

{

get

{

if (instance==null)

{

instance = new Singleton();

}

return instance;

}

}

}

说明:上面的方法是非线程安全的,2个不同的线程可以同时进入这个方法,如果instance为空的并且这里返回真的情况下,都可以创建实例,这显然违反了单例模式,实际上,在测试以前,实例就已经有可能被创建了,

但是内存模型不能保证这个实例能被其他的线程看到,除非合适的内存屏障已经被跨过了。

2、简单的线程安全

public sealed class Singleton

{

private static Singleton instance = null;

private static readonly object padlock = new object();

Singleton()

{

}

public static Singleton Instance

{

get

{

lock (padlock)

{

if (instance == null)

{

instance = new Singleton();

}

return instance;

}

}

}

}

上述实现是线程安全的。这个线程在共享的object上取出了一把锁,然后在创建实例以前检查这个实例是否被创建了。

这个保护了内存屏障问题(lock保证了所有的读取操作是在LOCK获得以后发生的,所有的unlock保证了所有的写操作在lock 释放以后发生的),这样就保证了一个线程只能创建一个实例(每次只有一个线程在这段代码中运行),不巧的是,性能上来说,锁变成了每次都必须的当这个实例被响应的时候。

3、尝试线程安全(双重锁定)不推荐使用

public sealed class Singleton

{

private static Singleton instance = null;

private static readonly object padlock = new object();

Singleton()

{

}

public static Singleton Instance

{

get

{

if (instance == null)

{

lock (padlock)

{

if (instance == null)

{

instance = new Singleton();

}

}

}

return instance;

}

}

}

4、不完全lazy,但是线程安全且不用用锁 推荐使用

public sealed class Singleton

{

private static readonly Singleton instance = new Singleton();

// 显示的static 构造函数

//没必要标记类型 - 在field初始化以前

static Singleton()

{

}

private Singleton()

{

}

public static Singleton Instance

{

get

{

return instance;

}

}

}

欢迎关注我的公众号(同步更新文章)DoNet技术分享平台

阅读原文

C#开发模式——单例模式相关推荐

  1. 网上商城代码实现_中国中铁网上商城转型敏捷开发模式,实现快速反应、快速迭代...

    △北研中心的同事给业务部门演示迭代成果中国中铁网上商城成功转型敏捷开发模式,实现快速反应.快速迭代.切实解决公司内部以及合作方的业务需求,更好服务多样化的客户群体.经历了两次每2周为一迭代的短期快速开 ...

  2. 飞桨深度学习开源框架2.0抢先看:成熟完备的动态图开发模式

    百度飞桨于近期宣布,深度学习开源框架2.0抢先版本正式发布,进入2.0时代.其中一项重大升级,就是推出更加成熟完备的命令式编程模式,即通常说的动态图模式.同时在该版本中将默认的开发模式定为动态图模式, ...

  3. OpenSource的开发模式探讨

    为什么80%的码农都做不了架构师?>>>    OpenSource的开发模式探讨zt http://mail.mailer.com.cn:81/article/articlevie ...

  4. 架构师是如何炼成的?以天猫APP架构开发模式升级工程为例

    在集团大数据.算法的背景下,猫客(天猫客户端)首页率先从2015年的坑位运营走向2016年的全面个性化,猫客首页个性化业务点多达50多处,个性化场景大部分通过通过Aladdin(天猫推荐)接入TPP( ...

  5. Entity Framework技术系列之2:三种开发模式实现数据访问

    前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对 ...

  6. webpack 开发模式管理 Development

    webpack 开发模式管理 Development GitHub 学习 Demo. 接下来将一些开发时的 webpack 配置. warnning : 本指南中的工具仅用于开发,请避免在生产中使用它 ...

  7. jsp基础、el技术、jstl标签、javaEE的开发模式

    一.jsp技术基础 1.jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%=java变量或表达式> ...

  8. apollo local 模式_Java客户端使用指南 - 五、本地开发模式 - 《携程 Apollo v1.4 开发指南》 - 书栈网 · BookStack...

    五.本地开发模式 Apollo客户端还支持本地开发模式,这个主要用于当开发环境无法连接Apollo服务器的时候,比如在邮轮.飞机上做相关功能开发. 在本地开发模式下,Apollo只会从本地文件读取配置 ...

  9. 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具...

    认识Web.桌面和移动app新开发模式 - 基于Node.js环境和VS Code工具 一.开发环境的搭建(基于win10) 1.安装node.js和npm 到node.js官网下载安装包(包含npm ...

最新文章

  1. c# winform笔记
  2. Python属性和内建属性
  3. python算法攻略_算法基础及python实现笔记一(堆和DFS)
  4. BASE64Encoder及BASE64Decoder的正确用法
  5. 6选择内核启动项_Linux内核都没搞懂,Alot和你还有什么关系?
  6. 深入理解Java虚拟机:垃圾收集器与内存分配策略
  7. 7-汇编大小写字符互相转化+[bx+idata]+SI/DI
  8. 云盘上传一直显示服务器出错_百度云盘一直服务器忙 百度网盘出现服务器错误...
  9. STM32 IIC实验中关于AT24Cxx的读写
  10. 时间序列之平稳时间序列预测、趋势型序列预测、复合型序列预测
  11. 为什么说程序员做外包没前途?
  12. 向量叉积分配律简单证明
  13. 大学计算机课能旷课吗,计算机课旷课检讨书
  14. JS 进阶 (六) 浏览器事件模型DOM操作
  15. QNAP文件系统不干净,qFinder搜索不到nas,可以ping通
  16. 服务器主机如何安装系统安装系统安装,服务器主机系统安装教程
  17. Flak执行端口被占用OSError: [Errno 48] Address already in use
  18. 我主修计算机科学英文,计算机科学,computer science英语短句,例句大全
  19. UE4打包导出文件打开没反应
  20. 世界银行1960-2019年制造业增加值

热门文章

  1. C#条件运算符if-else的简化格式
  2. python中yield的用法详解——最简单,最清晰的解释(转载)
  3. 在win10 或者win7系统下装双系统ubuntu16.04教程
  4. oracle使用loop将增加十天,使用loop循环操作DML语句
  5. java前端ajax提交数据_Java 前端使用Ajax通过FormData传递文件和表单数据到后台
  6. Min_25 筛小结
  7. Windows下图文详解PHP三种运行方式(php_mod、cgi、fastcgi)
  8. JVM——类加载机制
  9. Google Guava学习笔记——基础工具类Joiner的使用
  10. java设计模式之单例模式(七种方法)