.NET之C#编程:懒汉模式的终结,单例模式的正确打开方式

概述

在C#编程世界中,单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。然而,传统的懒汉模式实现方式在多线程环境下存在安全隐患。本文将深入探讨单例模式的正确实现姿势,带你走出懒汉模式的误区,掌握单例模式的高级玩法。

单例的正确打开方式

一、单例模式的基本概念单例模式确保一个类在任何情况下都只有一个实例,并且提供一个全局访问点。这在配置管理、连接池等场景中非常有用。

二、懒汉模式的陷阱懒汉模式在第一次调用GetInstance方法时才会创建实例,看起来简单,但在多线程环境下,可能会创建多个实例。

 
public class LazySingleton
{private static LazySingleton instance;private LazySingleton() { }public static LazySingleton GetInstance(){if (instance == null){instance = new LazySingleton();}return instance;}
}

使用场景:单例实例在多线程访问前不需要初始化。优点:延迟加载,节省资源。缺点:多线程环境下不安全。

三、线程安全的懒汉模式通过lock关键字确保线程安全,但这种方式存在性能瓶颈。

 
private static readonly object lockObject = new object();
public static Singleton GetInstance()
{if (instance == null){lock (lockObject){if (instance == null){instance = new Singleton();}}}return instance;
}

使用场景:需要确保线程安全的单例。优点:线程安全。缺点:性能开销大。

四、静态初始化器的单例模式C#的静态初始化器是线程安全的,并且不需要使用lock,这是实现单例模式的一种简洁方式。

 
public class StaticInitializerSingleton
{private static readonly StaticInitializerSingleton instance = new StaticInitializerSingleton();private StaticInitializerSingleton() { }public static StaticInitializerSingleton GetInstance(){return instance;}
}

使用场景:适用于大多数单例模式需求。优点:简洁,线程安全。缺点:实例在类加载时就创建,无法延迟加载。

五、使用Singleton属性通过一个静态只读属性来实现单例,这种方式同样利用了静态初始化的线程安全性。

 
public class ReadOnlySingleton
{private static readonly ReadOnlySingleton instance = new ReadOnlySingleton();private ReadOnlySingleton() { }public static ReadOnlySingleton Instance { get { return instance; } }
}

使用场景:需要通过属性访问单例实例。优点:简洁,线程安全。缺点:同静态初始化器。

六、双重检查锁定模式双重检查锁定模式是懒汉模式的一个改进,它既保证了线程安全,又避免了不必要的锁。

 
public class DoubleCheckedLockingSingleton
{private static readonly object lockObject = new object();private static DoubleCheckedLockingSingleton instance;public static DoubleCheckedLockingSingleton GetInstance(){if (instance == null){lock (lockObject){if (instance == null){instance = new DoubleCheckedLockingSingleton();}}}return instance;}
}

使用场景:需要延迟加载的单例,且要求线程安全。优点:线程安全,延迟加载。缺点:代码复杂。

七、使用静态构造函数静态构造函数在类首次加载时执行,可以用来初始化静态成员,但这种方式不支持延迟加载。

 
public class StaticConstructorSingleton
{private static readonly StaticConstructorSingleton instance;static StaticConstructorSingleton(){instance = new StaticConstructorSingleton();}private StaticConstructorSingleton() { }public static StaticConstructorSingleton GetInstance(){return instance;}
}

使用场景:类加载时需要初始化的单例。优点:线程安全,无需手动同步。缺点:不支持延迟加载。

八、总结单例模式的实现方式多种多样,每种方式都有其适用场景和优缺点。在实际开发中,我们应该根据具体需求选择合适的实现方式。对于大多数情况,推荐使用静态初始化器的方式,因为它简洁且线程安全。如果需要延迟加载,可以考虑使用双重检查锁定模式。

结语:单例模式是C#编程中的经典模式,正确实现单例模式不仅可以保证程序的稳定性,还可以提高代码的可维护性。希望通过本文的探讨,能够帮助大家避免使用懒汉模式,掌握单例模式的正确实现方式,写出更加优雅、高效的代码。

往期精品推荐:

在国内默默无闻的.NET,在国外火的超乎想象?

C#的膨胀之路:创新还是灭亡

介绍.NET 6款好看的winform开源UI库

介绍一款最受欢迎的.NET 开源UI库

WPF第三方开源UI框架:打造独特体验的魔法师

WPF与Winform,你的选择是?

WinForm的前世今生

.NET成年了,然后呢?——编程界的逆袭传奇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/364763.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

静态时序分析:ideal_clock、propagated_clock以及generated_clock的关系及其延迟计算规则(二)

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 生成时钟 上一节中,我们讨论了理想时钟和传播时钟的创建和使用,本节将讨论生成时钟及其与理想时钟和传播时钟的关系。 图1所示的是一个简…

【2024最新版】图解Mysql数据库配置、命令行及Workbench访问(Windows版本)

目录 1. 准备工作1.1 安装MySQL1.2 验证MySQL的环境变量 2. 环境变量配置3. 访问MySQL3.1 命令行访问MySQL3.2 Workbench访问MySQL 1. 准备工作 1.1 安装MySQL 如果您已经安装了MySQL,请从【2. Mysql 环境配置】开始;如果您没有安装MySQL,请…

iOS17系统适配

iOS17 新功能 文章目录 iOS17 新功能iOS17支持哪几款机型Xcode15新特性iOS17-开发适配指南 横屏待机 在iOS 17中,还带来了横屏待机功能,苹果将这个新功能命名为“Standby”模式,为 iPhone 带来了全新的玩法。iPhone启用之后,默认情…

支持纳管达梦数据库,命令存储支持对接Elasticsearch 8,JumpServer堡垒机v3.10.11 LTS版本发布

2024年6月24日,JumpServer开源堡垒机正式发布v3.10.11 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和优化,并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS最新版本,以获得更佳的使用体验。 在JumpServer v3.10.…

期末模拟题---期末复习3

头插法建立单链表 #include <stdio.h> #include <stdlib.h>struct Node //定义结构体 {char data; //数据域struct Node * next; //指针域 };/* 请在这里填写答案 */ struct Node * CreateList (struct Node * head) {struct Node *p;char ch;scanf(&…

黑马点评-Redis的缓存击穿,缓存雪崩,缓存穿透,互斥锁

文章目录 1.缓存穿透2.缓存雪崩3.缓存击穿3.1 互斥锁 1.缓存穿透 解决办法 写入NULL值到Redis缓存&#xff0c;以后就会命中Redis的控制缓存而不会出现请求直接打到数据库的问题&#xff01; 代码 2.缓存雪崩 这个概念很好理解&#xff0c;雪崩就是无数的小雪花结构突然因…

百度网盘下载速度慢的解决办法

目录 一、背景 二、解决办法 1、点击三个竖点&#xff0c;再点设置 2、点击传输&#xff0c;再点击去开启该功能 3、点击同意&#xff0c;开启优化速率 三、结果 四、备注 一、背景 当你不是百度网盘会员时&#xff0c;你在使用百度网盘下载时&#xff0c;是否下载速度太…

目前常见的几款企业级im即时通讯软件有哪些?

在目前的市场上&#xff0c;有几款常见的企业级即时通讯软件广受企业青睐。以下是其中几款主流企业级即时通讯软件的介绍和特点。 1. 微软Teams 微软Teams是一款集即时通讯、协作和视频会议功能于一体的企业级通讯软件。它提供了实时聊天、语音通话、视频会议、文件共享和团队…

Golang-channel理解

channel golang-channel语雀笔记整理 channelgolang channel的设计动机&#xff1f;chanel的数据结构/设计思考 golang channel的设计动机&#xff1f; channel是一种不同协程之间实现异步通信的数据结构。golang中有一种很经典的说法是要基于通信实现共享内存&#xff0c;而不…

昇思25天学习打卡营第5天|GAN图像生成

文章目录 昇思MindSpore应用实践基于MindSpore的生成对抗网络图像生成1、生成对抗网络简介零和博弈 vs 极大极小博弈GAN的生成对抗损失&#xff1a; 2、基于MindSpore的 Vanilla GAN3、基于MindSpore的手写数字图像生成导入数据数据可视化模型训练 Reference 昇思MindSpore应用…

Spring Cloud LoadBalancer基础入门与应用实践

官网地址&#xff1a;https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html 【1】概述 Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器&#xff0c;它包含在SpringCloud-commons中用…

json文件 增删查改

默认收藏夹 qt操作json格式文件... 这个人的 写的很好 我的demo全是抄他的 抄了就能用 —————————— 下次有空把我的demo 传上来 在E盘的demo文件夹 json什么名字

追觅科技25届校招校招24年社招科技北森题库商业推理综合测评答题攻略、通关技巧

一、追觅科技这家公司怎么样&#xff1f; 追觅科技是一家在智能清洁家电领域表现出色的企业。 二、追觅科技待遇怎么样 追觅科技的待遇在业内具有竞争力&#xff0c;具体信息如下&#xff1a; 1. **薪酬结构**&#xff1a;根据对外经济贸易大学招生就业处发布的2023届校园招…

Ubuntu挂载window的网络共享文件夹爱

1.进入win10创建一个用户smb密码也是smb 2.右键进入文件夹共享 3.进入Ubuntu安装支持cifs-utils sudo apt update sudo apt install cifs-utils 4.sudo mkdir /mnt/shared 5.挂载&#xff1a; sudo mount -t cifs -o usernamesm bpasswordsmb //172.16.11.37(windowsIP)/s…

杨幂跨界学术圈:内容营销专家刘鑫炜带你了解核心期刊的学术奥秘

近日&#xff0c;知名艺人杨幂在权威期刊《中国广播电视学刊》上发表了一篇名为《浅谈影视剧中演员创作习惯——以电视剧<哈尔滨一九四四>为例》的学术论文&#xff0c;此举在学术界和娱乐圈均引起了广泛关注。该期刊不仅享有极高的声誉&#xff0c;还同时被北大中文核心…

sheng的学习笔记-AI-密度聚类

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 需要学习的前置知识&#xff1a;聚类&#xff0c;可参考&#xff1a;sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 什么是密度聚类 密度聚类亦称“基于密度的聚类”(density-based clustering)&#xff0c;此类算法假设…

Linux-笔记 OverlayFS文件系统小应用 恢复功能

前言 通过另一章节 OverlayFS文件系统入门 中已经大致了解了原理&#xff0c;这里来实现一个小应用。通过前面介绍我们已经知道lowerdir是只读层&#xff0c;upperdir是可读写层&#xff0c;merged是合并层&#xff08;挂载点&#xff09;&#xff0c;那么我们可以利用这个机…

【网络】计算机网络-基本知识

目录 概念计算机网络功能计算机网络的组成计算机网络的分类 网络地址网络地址的分类 计算机网络相关性能指标速率带宽吞吐量时延时延的种类&#xff1a; 时延带宽积往返时延RTT利用率 概念 计算机网络是指将多台计算机通过通信设备连接起来&#xff0c;实现数据和资源的共享。…

pandas数据分析(1)

pandas&#xff0c;即Python数据分析库&#xff08;Python data analysis library&#xff09; DataFrame和Series DataFrame&#xff08;数据帧&#xff09;和Series&#xff08;序列&#xff09;是pandas的核心数据结构。DataFrame的主要组件包含索引、列、数据。DataFrame和…

架构设计上中的master三种架构,单节点,主从节点,多节点分析

文章目录 背景单节点优点缺点 主从节点优点缺点 多节点优点缺点 多节点&#xff0c;多backup设计优点缺点 总结 背景 在很多分布式系统里会有master,work这种结构。 master 节点负责管理资源&#xff0c;分发任务。下面着重讨论下master 数量不同带来的影响 单节点 优点 1.设…