.NET单例模式快速学习应用
单例模式属于设计模式中最简单的一个模式,在实际应用中也非常广泛,但可能是受到各类教程的影响,看到很多实现方式仍然沿用Java的那一套,其实在.NET中可以用更简洁的实现方式。
一、知识点介绍
核心目标:为了项目各处调用的都是同一个实例对象,从而实现资源共享。例如环境变量。
常见的实现方式:饿汉模式、懒汉模式、双锁模式、延迟加载模式
二、实现方式
/// <summary>
/// 饿汉模式,每次都加载会造成资源浪费
/// </summary>
public class EagerSingleton
{
public static Demo Instance { get; } = new Demo();
}
/// <summary>
/// 懒汉模式,适用于没有多线程的简单应用
/// </summary>
public class LazySingleton
{
private static Demo _instance = null;
public static Demo Instance
{
get
{
if (_instance == null)
_instance = new Demo();
return _instance;
}
}
}
/// <summary>
/// 线程安全
/// </summary>
public class ThreadSafeSingleton
{
private static Demo _instance = null;
private static readonly object _lock = new object();
public static Demo Instance
{
get
{
if (_instance == null)
{
lock (_lock)
{
if (_instance == null)
_instance = new Demo();
}
}
return _instance;
}
}
}
/// <summary>
/// 延迟加载,利用静态类访问即创建的特点,兼顾易用性和线程安全的最佳实践
/// </summary>
public class DelaySingleton
{
/// <summary>
/// 内部静态类
/// </summary>
static class Nested
{
internal static readonly Demo Instance = new Demo();
} public static Demo Instance => Nested.Instance;
}
调用方式
static void Main(string[] args)
{
ThreadPool.SetMaxThreads(, );// 调整最大线程数
ThreadPool.SetMinThreads(, );// 调整最小线程数 Console.WriteLine("========== 示例:饿汉模式的多线程 ==========");
Parallel.For(, , (i) =>
{
Console.WriteLine($"{EagerSingleton.Instance.Id} ");
}); Console.WriteLine();
Console.WriteLine("========== 示例:懒汉模式的多线程 ==========");
Parallel.For(, , (i) =>
{
Console.WriteLine($"{LazySingleton.Instance.Id} ");
}); Console.WriteLine();
Console.WriteLine("========== 示例:线程安全模式的多线程 ==========");
Parallel.For(, , (i) =>
{
Console.WriteLine($"{ThreadSafeSingleton.Instance.Id} ");
}); Console.WriteLine();
Console.WriteLine("========== 示例:延迟加载模式的多线程 ==========");
Parallel.For(, , (i) =>
{
Console.WriteLine($"{DelaySingleton.Instance.Id} ");
}); Console.ReadKey();
} public class Demo
{
public string Id { get; private set; }
public Demo() { Id = Guid.NewGuid().ToString(); }
}
调用结果:

三、结论
> 饿汉模式适用于初学者,简单易记,但是没有考虑资源占用。
> 懒汉模式也适用于初学者,也简单易记,考虑了资源占用,但是没有考虑线程安全。
> 双锁模式兼顾了实用性和线程安全,实现比较繁琐,是以前比较常用的方式,比较直观好理解。
> 延迟加载模式,兼顾了易用性、简洁和线程安全,需要理解静态类的初始化机制,这种实现方式目前是最优解。
> 单例模式不要实现 ICloneable 接口,不要涉及序列化,否则就会出现多个对象。
四、参考资料
.NET单例模式快速学习应用的更多相关文章
- 60分钟Python快速学习(给发哥一个交代)
60分钟Python快速学习 之前和同事谈到Python,每次下班后跑步都是在听他说,例如Python属于“胶水语言啦”,属于“解释型语言啦!”,是“面向对象的语言啦!”,另外没有数据类型,逻辑全靠空 ...
- LinqPad工具:帮你快速学习Linq
LinqPad工具:帮你快速学习Linq 参考: http://www.cnblogs.com/li-peng/p/3441729.html ★:linqPad下载地址:http://www.linq ...
- 快速学习C语言一: Hello World
估计不会写C语言的同学也都听过C语言,从头开始快速学一下吧,以后肯定能用的上. 如果使用过其它类C的语言,如JAVA,C#等,学C的语法应该挺快的. 先快速学习并练习一些基本的语言要素,基本类型,表达 ...
- 【Java线程池快速学习教程】
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
- 【Java的JNI快速学习教程】
1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时 ...
- 快速学习bootstrap前台框架
W3c里的解释 使用bootstrap需要注意事项 1. 在html文件第一行要加上<!doctype html>[s1] 2. 导入bootstrap.min.css文件 3. 导 ...
- C#快速学习笔记(译)
下面是通过代码快速学习C#的例子. 1.学习任何语言都必定会学到的hello,world! using System; public class HelloWorld { public static ...
- Dapper快速学习
Dapper快速学习 我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dap ...
- ASP.NET快速学习方案(.NET菜鸟的成长之路)
想要快速学习ASP.NET网站开发的朋友可以按照下面这个学习安排进度走.可以让你快速入门asp.net网站开发!但也局限于一般的文章类网站!如果想学习更多的技术可以跟着我的博客更新走!我也是一名.NE ...
随机推荐
- 渗透-svn源代码泄露漏洞综合利用
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion ...
- Oracle数据库提权(dba权限执行系统命令)
0x01 提权准备 这里我们先创建一个低权限的用户test SQL> conn sys/admin123@orcl as sysdba; 已连接. SQL> create user tes ...
- Python开发【第九篇】字典
字典 字典是一种可变的容器,可以存储任意类型的数据 字典中的每个数据都是用键进行索引,而不像序列容器(str,list,tuole)可以用整数进行索引 字典中的数据没有先后顺序,字典的存储是无序的 字 ...
- [AHOI2002]哈利·波特与魔法石
这道题比较简单,就是一个最短路(SSSP).数据水,用Floyd即可AC.这里用了Dijkstra. #include <iostream> #include <cstdio> ...
- SpringBoot系列教程之Bean加载顺序之错误使用姿势辟谣
在网上查询 Bean 的加载顺序时,看到了大量的文章中使用@Order注解的方式来控制 bean 的加载顺序,不知道写这些的博文的同学自己有没有实际的验证过,本文希望通过指出这些错误的使用姿势,让观文 ...
- Python 调用图灵机器人 API
''' Python3''' import requests #导入requests库 import json #导入json库 key = '3119f1e3610f42c5977ea73c4097 ...
- solr学习篇(四) java使用solr简单查询(初识solrj)
使用java实现solr查询 目录:1:导入jar包 2:核心类介绍 3:代码实现 4:注意事项 一 导入jar包 solrj可以使Java应用程序很方便的访问与操作solr. solrj有几个核心类 ...
- 闪讯 开启wifi教程
这是我自己试了几次之后发现的,也不是什么技术活. 首先说下,我的比较是小米pro笔记本,一般笔记本都是自带wifi功能的.如果要开wifi的话,必须是用网线连接才可以,通过wifi连接网络就不能开移动 ...
- JVM(9) 程序编译及代码优化
一.早期(编译器)优化 1.编译期 Java 语言的 “编译期” 其实是一段 “不确定” 的操作过程,因为它可能是指 一个前端编译器(其实叫 “编译器的前端” 更准确一些)把 *.java 文件转变成 ...
- Tkinter 之Entry输入框标签
一.参数说明 语法 作用 Entry(root,width=20) 组件的宽度(所占字符个数) Entry(root,fg='blue') 前景字体颜色 Entry(root,bg='blue') 背 ...