单例模式属于设计模式中最简单的一个模式,在实际应用中也非常广泛,但可能是受到各类教程的影响,看到很多实现方式仍然沿用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 接口,不要涉及序列化,否则就会出现多个对象。

 四、参考资料

设计模式的征途—1.单例(Singleton)模式

C# 单例模式的五种写法

最新文章

  1. 关于利用bat文件调用exe批量处理文件下的文件的问题
  2. Android安装BusyBox(三星N7108)
  3. javascript获取url信息的常见方法
  4. iOS 8自动调整UITableView和UICollectionView布局
  5. HDU 5044 TREE
  6. where 1=1
  7. iOS中Block介绍 基础
  8. undefined与null
  9. MySQL 导入外部数据时报错:1153: Got a packet bigger than &#39;max_allowed_packet&#39; 解决方案
  10. Solr4.7.0连接MySQL
  11. golang初识 - install go on ubuntu
  12. JS-使用indexof来统计字符出现次数
  13. html 高亮显示表格当前行【转】
  14. Java并发编程、内存模型与Volatile
  15. mysql更新(八) 可视化工具Navicat的使用 索引
  16. 初识Qt简单动画
  17. server2012 配置SSL证书
  18. lintocde-247-线段树的查询 II
  19. 8个使用JavaScript展示图片解决方案
  20. MySQL Batched Key Access

热门文章

  1. Kibana 快速入门教程
  2. .Net Core3.0使用gRPC
  3. 马蜂窝 IM 移动端架构的从 0 到 1
  4. Oracle数据库提权(低权限提升至dba)
  5. php代码Xdebug调试使用笔记
  6. [CF544] D. Destroying Roads
  7. 前端深入之css篇丨初探【transform】,手把手带你实现1024程序员节动画
  8. 第三方应用 flashfxp,filezilla提权
  9. ESP32 开发之旅① 走进ESP32的世界 安装开发环境
  10. Leetcode(5)最长回文子串