一、单例模式

①单例模式的定义:是用来保证这个类在运行期间只会被创建一个实例,并提供一个访问它的全局访问点。

②单例模式的作用:保证一个类只有一个访问实例,节省系统资源。

③单例模式的特点:私有构造方法;私有成员变量;公有获取实例方法。

二、单例模式实现

①懒汉式单例

using System;
using System.Collections.Generic;
using System.Text;namespace SingleModel
{//懒汉式单例模式public class Single{//私有构造private Single() { }//单例public static Single GetInstance(){return SingleHolder._Instance;}//内部类private static class SingleHolder{internal static readonly Single _Instance = new Single();}}//Class_end
}

②饿汉式单例

using System;
using System.Collections.Generic;
using System.Text;namespace SingleModel
{//饿汉式单例模式public class Single2{private static readonly Single2 _Instance = new Single2();private Single2() { }public static Single2 GeInstance(){return _Instance;}}//Class_end
}

③懒汉式单例

using System;
using System.Collections.Generic;
using System.Text;namespace SingleModel
{//懒汉式单例public class Single3{//定义一个保存实例的静态变量private static Single3 _Instance;//定义一个保证线程同步标识private static readonly object _Synchronized = new object();private Single3() { }public static Single3 GeInstance(){if (_Instance==null){lock (_Synchronized){//双重锁定if (_Instance==null){_Instance = new Single3();}}}return _Instance;}}//Class_end
}

④实现控制实例数目单例

using System;
using System.Collections.Generic;
using System.Text;namespace SingleModel
{//实现控制实例数目public class SingleExtand{//私有构造private SingleExtand() { }//定义一个缺省的key值前缀 private static string _DefaultPreKey = "Cache";//记录当前实例public static int _SingleNum = 1;//定义实例的最大数目private static int _MaxSingleNum = 3;//定义一个保证线程同步的标识private static readonly object _Synchronized = new object();//缓存实例的容器private static Dictionary<String, SingleExtand> _SinleDic = new Dictionary<string, SingleExtand>();//本类实例public static SingleExtand GetInstance(){string key = _DefaultPreKey + _SingleNum;SingleExtand sinleExtand = null;if (_SinleDic.ContainsKey(key)){sinleExtand = _SinleDic[key];}if (sinleExtand==null){lock (_Synchronized){if (sinleExtand == null){sinleExtand = new SingleExtand();_SinleDic.Add(key, sinleExtand);}} }_SingleNum++;if (_SingleNum>_MaxSingleNum){_SingleNum = 1;}return sinleExtand;}}//Class_end
}

三、单例测试

using System;namespace SingleModel
{class Program{static void Main(string[] args){Console.WriteLine("(线程安全)单例模式");Console.WriteLine("饿汉式单例1");Single single1 = Single.GetInstance();Single single2 = Single.GetInstance();Single single3 = Single.GetInstance();Console.WriteLine("single1:" + single1.GetHashCode());Console.WriteLine("single2:" + single2.GetHashCode());Console.WriteLine("single3:" + single3.GetHashCode());Console.WriteLine("\n");Console.WriteLine("懒汉式单例2");Single2 single21 = Single2.GeInstance();Single2 single22 = Single2.GeInstance();Single2 single23 = Single2.GeInstance();Console.WriteLine("single21:" + single21.GetHashCode());Console.WriteLine("single22:" + single22.GetHashCode());Console.WriteLine("single23:" + single23.GetHashCode());Console.WriteLine("\n");Console.WriteLine("懒汉式单例3");Single3 single31 = Single3.GeInstance();Single3 single32 = Single3.GeInstance();Single3 single33 = Single3.GeInstance();Console.WriteLine("single31:" + single31.GetHashCode());Console.WriteLine("single32:" + single32.GetHashCode());Console.WriteLine("single33:" + single33.GetHashCode());Console.WriteLine("\n");Console.WriteLine("控制实例数目的单例");SingleExtand singleExtand1 = SingleExtand.GetInstance();SingleExtand singleExtand2 = SingleExtand.GetInstance();SingleExtand singleExtand3 = SingleExtand.GetInstance();SingleExtand singleExtand4 = SingleExtand.GetInstance();SingleExtand singleExtand5 = SingleExtand.GetInstance();SingleExtand singleExtand6 = SingleExtand.GetInstance();Console.WriteLine("singleExtand1:" + singleExtand1.GetHashCode());Console.WriteLine("singleExtand2:" + singleExtand2.GetHashCode());Console.WriteLine("singleExtand3:" + singleExtand3.GetHashCode());Console.WriteLine("singleExtand4:" + singleExtand4.GetHashCode());Console.WriteLine("singleExtand5:" + singleExtand5.GetHashCode());Console.WriteLine("singleExtand6:" + singleExtand6.GetHashCode());Console.WriteLine("\n");Console.ReadLine();}}
}

运行结果如下:

C#中线程安全的单例模式相关推荐

  1. Java中线程安全的单例模式

    写出一个单例模式(Singleton Pattern) public final class EagerSingleton {    private static EagerSingleton sin ...

  2. Android之线程安全的单例模式,Adapter注意事项之引用传值

    线程安全的单例模式 单位模式一般写法如下: public static FestivalLab mInstance; private FestivalLab() { } public static F ...

  3. java 静态内部类 线程安全问题_单例模式的七种写法, 面试题:线程安全的单例模式...

    http://cantellow.iteye.com/blog/838473 http://meizhi.iteye.com/blog/537563 第一种(懒汉,线程不安全): Java代码  pu ...

  4. C++实现线程安全的单例模式

    C++实现线程安全的单例模式 1.单例模式 一个简单的单例模式很容易实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实 ...

  5. 生产者消费者模型、信号量、线程池以及单例模式的实现

    生产者消费者模型!!---对典型的应用场景设计的解决方案 生产者与消费者模型应用场景:有线程不断的生产数据,有线程不断的处理数据. 数据的生产与数据的处理:放在同一个线程中完成,因为执行流只有一个,那 ...

  6. JAVA的多线程、死锁、线程间通信、如何规避死锁、线程安全的单例模式

    主要内容: 多线程 线程和进程间的关系 Java中的线程理论 Java中线程类的实现方式 Java中线程的常用方法 线程安全性问题 线程间通信 线程的死锁 如何规避死锁 线程安全的单例模式 多线程 线 ...

  7. java中的7种单例模式

    java中的7种单例模式 单例模式是我们开发中经常会用到的,单例模式的好处是应用在运行时只有一个实例,生命周期从单例实例化后一直到应用生命周期结束.这里总结和比较一下几种单例的形式,共总结了七种. 写 ...

  8. java for(o t :object) 获取顺序号_java中线程的生命周期

    线程是java中绕不过去的一个话题, 今天本文将会详细讲解java中线程的生命周期,希望可以给大家一些启发. java中Thread的状态 java中Thread有6种状态,分别是: NEW – 新创 ...

  9. Windows核心编程 第八章 用户方式中线程的同步(上)

    第8章 用户方式中线程的同步 当所有的线程在互相之间不需要进行通信的情况下就能够顺利地运行时, M i c r o s o f t Wi n d o w s的运行性能最好.但是,线程很少能够在所有的时 ...

最新文章

  1. SpringBoot项目打包war部署到服务器去掉项目名所遇到的坑
  2. rowbounds分页oracle,Oracle使用MyBatis中RowBounds实现分页查询功能
  3. js判断浏览器\屏幕分辨率(转载)
  4. Linux C : GDB调试命令汇总
  5. Spring mvc 启动配置文件加载两遍问题
  6. Redirecting to binsystemctl start crond.service
  7. 0003-Longest Substring Without Repeating Characters(无重复字符的最长子串)
  8. Erlang程序设计
  9. 我的makefile写法(一)
  10. 刷前端面经笔记(二)
  11. python3有什么用_Python 3.9的到来到底是意味着什么
  12. 苹果怒封Google、FB:私下购买用户隐私被制裁,数万员工受牵连
  13. Sugar Bytes WOW2 for Mac - 多功能滤波效果器
  14. dpkg:处理软件包 xxx (--configure)时出错
  15. [恢]hdu 2003
  16. C语言学习资料汇集 助你成为更好的程序员
  17. 修改数据文件和日志文件路径
  18. word文件在线转换成pdf
  19. b 树 mysql联合索引_Mysql之B+树索引实战
  20. oracle经典分数排名,力扣数据库题目: 分数排名(中等)

热门文章

  1. Aspose.OCR for Java Crack by Xacker
  2. 03环信好友管理 - 获取好友列表
  3. matlab区域法直线度,用最小区域法求直线度误差的探讨
  4. Robomaster上位机视觉摘要——比赛规则篇
  5. fastadmin介绍
  6. python练习题(难度高)
  7. Altium designer22 原理图库绘制知识点总结-1 altiumdesigner
  8. 跨站脚本攻击XSS:为什么cookie中有httpOnly属性
  9. java 捕捉的异常抛出_Java异常抛出和捕获
  10. ENVI安装步骤和常见问题及解决办法(以ENVI5.3为例)