1、非线程安全(经典模式),但没有考虑线程安全,在多线程时可能会出问题,不过还从没看过出错的现象。

/// <summary>/// 单例模式的实现/// </summary>public class Singleton{// 定义一个静态变量来保存类的实例private static Singleton uniqueInstance;// 定义私有构造函数,使外界不能创建该类实例private Singleton(){}/// <summary>/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点/// </summary>/// <returns></returns>public static Singleton GetInstance(){// 如果类的实例不存在则创建,否则直接返回if (uniqueInstance == null){uniqueInstance = new Singleton();}return uniqueInstance;}}

2、简单安全线程

/// <summary>/// 单例模式的实现/// </summary>public class Singleton{// 定义一个静态变量来保存类的实例private static Singleton uniqueInstance;// 定义一个标识确保线程同步private static readonly object locker = new object();// 定义私有构造函数,使外界不能创建该类实例private Singleton(){}/// <summary>/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点/// </summary>/// <returns></returns>public static Singleton GetInstance(){// 当第一个线程运行到这里时,此时会对locker对象 "加锁",// 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁// lock语句运行完之后(即线程运行完之后)会对该对象"解锁"lock (locker){// 如果类的实例不存在则创建,否则直接返回if (uniqueInstance == null){uniqueInstance = new Singleton();}}return uniqueInstance;}}

上面这种解决方案确实可以解决多线程的问题,但是上面代码对于每个线程都会对线程辅助对象locker加锁之后再判断实例是否存在,对于这个操作完全没有必要的,因为当第一个线程创建了该类的实例之后,后面的线程此时只需要直接判断(uniqueInstance==null)为假,此时完全没必要对线程辅助对象加锁之后再去判断,所以上面的实现方式增加了额外的开销,损失了性能,为了改进上面实现方式的缺陷,我们只需要在lock语句前面加一句(uniqueInstance==null)的判断就可以避免锁所增加的额外开销,这种实现方式我们就叫它 “双重锁定”,下面是具体实现代码:

3、尝试线程安全(双重锁定)

  /// <summary>/// 单例模式的实现/// </summary>public class Singleton{// 定义一个静态变量来保存类的实例private static Singleton uniqueInstance;// 定义一个标识确保线程同步private static readonly object locker = new object();// 定义私有构造函数,使外界不能创建该类实例private Singleton(){}/// <summary>/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点/// </summary>/// <returns></returns>public static Singleton GetInstance(){// 当第一个线程运行到这里时,此时会对locker对象 "加锁",// 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁// lock语句运行完之后(即线程运行完之后)会对该对象"解锁"// 双重锁定只需要一句判断就可以了if (uniqueInstance == null){lock (locker){// 如果类的实例不存在则创建,否则直接返回if (uniqueInstance == null){uniqueInstance = new Singleton();}}}return uniqueInstance;}}

4、饿汉模式(这种模式的特点是自己主动实例。)

public sealed class Singleton
{private static readonly Singleton instance=new Singleton();private Singleton(){}public static Singleton GetInstance(){return instance;}
}

5、不完全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;}}
}

6、完全延迟实例化

public sealed class Singleton
{private Singleton(){}public static Singleton Instance { get { return Nested.instance; } }private class Nested{// Explicit static constructor to tell C# compiler// not to mark type as beforefieldinitstatic Nested(){}internal static readonly Singleton instance = new Singleton();}
}

7、使用 .NET 4's Lazy<T> 类型

public sealed class Singleton
{private static readonly Lazy<Singleton> lazy =new Lazy<Singleton>(() => new Singleton());public static Singleton Instance { get { return lazy.Value; } }private Singleton(){}
}

详细内容介绍见网址:http://csharpindepth.com/Articles/General/Singleton.aspx#unsafe

转载于:https://www.cnblogs.com/Study088/p/7762745.html

C# 语句中的各种单例模式代码相关推荐

  1. python循环语句-python语句中Python循环语句(附代码)

    python语句多如牛毛,对于很多初学者来说,不知道该如何下手.今天本文将着重讲述python语句中for语句和while语句.都知道这2种语句都属于循环语句,for语句属于遍历循环,while语句属 ...

  2. python中if else语句_python 中if else 语句的作用及示例代码

    引入:if-else的作用,满足一个条件做什么,否则做什么. if-else语句语法结构 if 判断条件: 要执行的代码 else: 要执行的代码 判断条件:一般为关系表达式或bool类型的值 执行过 ...

  3. python if else语句例子,python 中if else 语句的作用及示例代码

    引入:if-else的作用,满足一个条件做什么,否则做什么. if-else语句语法结构 if 判断条件: 要执行的代码 else: 要执行的代码 判断条件:一般为关系表达式或bool类型的值 执行过 ...

  4. python中代码注释使用的符号是_Python语句中用于注释代码的符号是

    Python语句中用于注释代码的符号是 答:#号 发电机-双绕组变压器单元接线,发电机出口不装设断路器的原因是(???) 答:断路器造价高. 会计报表各项目的数据必须建立在()的基础之上 答:真实可靠 ...

  5. Python 实现语句中提取人名(附代码) | Python工具

    目录 前言 环境依赖 代码 总结 前言 本文提供将语句中的人名提取出来的工具方法,可以拿去直接使用. 环境依赖 需要安装两个库,其实一个也可以,但是我这边准备了两个库做个比较. 安装命令如下: pip ...

  6. Python教学 | Python 中的分支结构(判断语句)【附本文代码和数据】

    查看原文:[数据seminar]Python教学 | Python 中的分支结构(判断语句)[附本文代码和数据] Part1引言 上期文章我们学习了组合数据类型字典以及元组,这标志着 Python 基 ...

  7. Go 学习笔记(62)— Go 中 switch 语句中的 switch 表达式和 case 表达式之间的关系

    switch 语句对 switch 表达式的结果类型,以及各个 case 表达式中子表达式的结果类型都是有要求的. 毕竟,在 Go 语言中,只有类型相同的值之间才有可能被允许进行判等操作. 1. sw ...

  8. vba 字体颜色_多掌握一些VBA语句,让自己书写代码更加顺畅

    VBA 是好东西,对于身在职场的人员,或者是积极打拼的创业者,是数据分析的首选,他可以实现量身定做,解决一些规律性强的问题.或者代替人处理一些可以描述出有逻辑关系的数据分析.多掌握一些VBA语句,让自 ...

  9. switch的case使用数组C语言,使用常量数组的元素作为switch语句中的case

    我正在尝试将一组按键映射到一组命令.因为我处理来自多个地方的命令,所以我想在键和命令之间设置一个抽象层,这样如果我更改底层键映射,我就不必更改很多代码.我目前的尝试看起来像这样: // input.h ...

最新文章

  1. python3 request模块 https certificate verify failed 错误
  2. spark 源码分析之二十 -- Stage的提交
  3. python数据整理 高一_关于Python爬虫的最全知识梳理,项目经理花了三天总结出来的经验...
  4. 分布式定时任务框架Elastic-Job的使用
  5. 嵌入式 boa服务器移植
  6. 安全测试3_Web后端知识学习
  7. DELPHI利用WMI获取主板参数
  8. DELL笔记本E5400刷BIOS激活win7
  9. 工业设计算计算机类专业吗,北大工学院工业设计工程数一计算机方向经验贴
  10. 浅谈IPv6网络安全问题及解决对策
  11. 怎么看cf的服务器在哪个文件夹,cf录像在哪个文件夹
  12. STM32F103RCT6Mini开发板搭建指纹识别系统
  13. 提升社群转化率?3大步骤、6大技巧详解
  14. 【2】模块参数与模块之间的通信
  15. win10+Anaconda+pytorch+CUDA10.1安装指南
  16. 达梦的异构数据库同步软件DMHS的简单安装
  17. 80老翁谈人生(324):关于网络安全的迷思
  18. ROS下打开镭神智能c16雷达以及驱动的理解
  19. MySQL关键字的执行顺序分析
  20. Allegro如何取消Xnet操作指导

热门文章

  1. linux命令---查找文件中的内容
  2. (三)Sass和Compass--制作精灵图片
  3. file invalid or corrupt. -vs2010
  4. android用户界面之TabHost教程实例汇总
  5. [Tip: iShare Site] Move file/folder on iShare Site
  6. Symbian错误查询
  7. Java多线程2:Thread中的实例方法
  8. leetcood学习笔记-45-跳跃游戏二
  9. Python面向对象基础:设置对象属性
  10. js 获取字符串中的中文