当前位置:
首页 > Python基础教程 >
-
C#教程之C#设计模式 —— 单例模式
嗯,这是本人的第一篇随笔,就从最简单的单例模式开始,一步一步地记录自己的成长。
单例模式是最常见的设计模式之一,在项目代码中几乎随处可见。这个设计模式的目的就是为了保证实例只能存在一个。单例模式往下还能再细分为懒汉模式和饿汉模式。下面逐个来看。
1.饿汉模式
饿汉模式的做法是在类加载的时候就完成实例化,是线程安全的做法。
1 public class Singleton 2 { 3 //类加载的时候完成实例化 4 private static Singleton instance = new Singleton(); 5 6 private Singleton() 7 { 8 } 9 10 //直接返回实例 11 public static Singleton Instance 12 { 13 get 14 { 15 return instance; 16 } 17 } 18 }
2.懒汉模式
懒汉模式的做法就是在类加载的时候不创建实例,在第一次使用的时候才创建。但是这种做法并不是线程安全的,如果多个线程同时调用Instance,便会有多个实例创建,这就违反了单例模式的初衷。
1 public class Singleton 2 { 3 // 类加载的时候不直接创建实例 4 private static Singleton instance; 5 6 private Singleton() 7 { 8 9 } 10 11 public static Singleton Instance 12 { 13 get 14 { 15 if (instance == null) 16 { 17 //第一次使用的时候创建实例 18 instance = new Singleton(); 19 } 20 21 return instance; 22 } 23 } 24 }
3.线程安全懒汉模式
如何保证线程安全的同时又实现懒汉模式?最简单的方式就是在if判断外上锁。
1 public class Singleton 2 { 3 private static Singleton instance; 4 5 private static readonly object locker = new object(); 6 7 private Singleton() 8 { 9 10 } 11 12 public static Singleton Instance 13 { 14 get 15 { 16 //上锁 17 lock (locker) 18 { 19 if (instance == null) 20 { 21 instance = new Singleton(); 22 } 23 } 24 25 return instance; 26 } 27 } 28 }
但是这种做法在每次访问前的需要上锁,会影响多线程的性能,于是我们又有了双重检验锁。
4.双重检验锁
我们只需要在上锁之前再作一次if判断,就不会每次访问的时候都需要上锁了。
1 public class Singleton 2 { 3 private static Singleton instance; 4 5 private static readonly object locker = new object(); 6 7 private Singleton() 8 { 9 10 } 11 12 public static Singleton Instance 13 { 14 get 15 { 16 if (instance == null) 17 { 18 lock (locker) 19 { 20 if (instance == null) 21 { 22 instance = new Singleton(); 23 } 24 } 25 } 26 27 return instance; 28 } 29 } 30 }
栏目列表
最新更新
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.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式