当前位置:
首页 > Python基础教程 >
-
C#教程之设计模式——单例模式
慢慢的做记录,做最强大的自己
看了大话设计模式之后感触很深,发现自己还有很多学习的东西,设计软件并不是一两句代码把功能写完了就行,需要思考的内容有很多
代码来源参考大话设计模式这本书,这里在博客里记录一下,不可能每次都去翻书,但是在博客里面是非常好找的。
单例模式应用场景很多,比如我设置定时器,进行多线程任务管控,多线程的处理在我工作中编写代码的时候还是经常会用到的;或者我的软件中存在多个任务,但只能有
其中一个在运行;
单例模式:保证一个类里面只有一个实例,并提供一个访问他的全局访问点。
这个过程具体是怎么样的,就看一下下面的例子,比如我有一个任务类,我不想其他访问者不断的去new这个任务类,那么我就先私有化,私有化完毕后,再创建一个全局
访问点
private static Task Programx; //定义了一个任务编程x private Task() //先私有化,堵死外界利用new创建这个实例的可能 { } public static Task GetTask() //利用GetTask方法获得唯一的一个全局访问点 { if (Programx == null) //如果任务不存在,就new一个,存在就返回已有的 { Programx = new Task(); } return Programx; }
在使用者进行调用时,就不需要不断的去new这个任务类了,理解起来还是很简单的
static void Main(string[] args) { Task T1 = Task.GetTask(); Task T2 = Task.GetTask(); if (T1 == T2) { Console.WriteLine("存在两个相同的任务"); } Console.ReadLine(); }
多线程里面处理又是怎么样的呢,我们知道,多线程处理时可以通过用锁(lock)来阻止线程访问,lock确保当一个线程位于临界区时,另一个线程不进入临界区。如果其他线程试图进入已经被我锁定的代码里面,那么它就会被阻止,除非我释放了当前对象。
下面这段代码中展示了对象实例由最先进入的那个线程创建,以后在线程再进入的时候就不会去创建对象实例了,也保证了多线程的环境下的同时访问也不会造成多个实例的生成
class SingleTon { private static SingleTon instance; private static readonly object syncRoot = new object(); private SingleTon() { } private static SingleTon GetInstance() { lock (syncRoot) //在同一时刻只有加锁的才能进去 { if (instance == null) { instance = new SingleTon(); } } return instance; } }
现在我们看一下双重锁定,上面的例子里面每次都要给线程加锁,双重锁定则只在实例未被创建的时候进行加锁处理,同时也能保证多线程的安全
class SingleTon { private static SingleTon instance; private static readonly object syncRoot = new object(); private SingleTon() { } private static SingleTon GetInstance() { if(instance == null) //先判断实例是否存在,不存在再加锁处理 { lock (syncRoot) { if (instance == null) //双重锁定 { instance = new SingleTon(); } } } return instance; } }
其实单例模式也很简单,归纳一下其实就是去判断实例是否存在,存在的话就直接返回,不存在就new一个实例,使用的人就可以严格的控制这个类不断的被new了
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式