C#中单例模式与多线程怎么用
发表于:2025-11-19 作者:千家信息网编辑
千家信息网最后更新 2025年11月19日,这篇文章给大家分享的是有关C#中单例模式与多线程怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、单例模式我们先来看看两种创建单例模式的示例代码。1、饿汉式饿汉式创建
千家信息网最后更新 2025年11月19日C#中单例模式与多线程怎么用
这篇文章给大家分享的是有关C#中单例模式与多线程怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
一、单例模式
我们先来看看两种创建单例模式的示例代码。
1、饿汉式
饿汉式创建单例模式是在程序里面直接初始化了一个对象实例:
class Good{ /// /// 私有的静态变量,直接初始化 /// private static Good Instance = new Good(); /// /// 私有的构造函数 /// private Good() { } /// /// 获取静态实例的静态方法 /// /// public static Good GetInstance() { return Instance; }}2、懒汉式
上面使用饿汉式创建单例模式有一个缺点:如果程序不使用也会创建一个实例,这样也会占用一部分内存。有时候需要真正第一次用到的时候才去创建实例,这时候就需要使用懒汉式创建单例模式。
class Good{ /// /// 私有的静态变量 /// private static Good Instance = null; /// /// 私有的构造函数 /// private Good() { } /// /// 获取静态实例的静态方法 /// /// public static Good GetInstance() { if(Instance==null) { Instance = new Good(); } return Instance; }}二、单例模式和多线程
上面两种创建单例模式的方法,在单线程使用的时候都没有问题,饿汉式创建的单例模式在多线程使用时也没有问题,懒汉式方式创建的单例模式在多线程下就有问题了。那么该如何解决呢?
可以在GetInstance方法上面添加[MethodImpl(MethodImplOptions.Synchronized)]标注,标注为同步方法。也可以使用lock关键字,我们看看一下如何使用lock关键字:
class Good { /// /// 私有的静态变量 /// private static Good Instance = null; private static object locker = new object(); /// /// 私有的构造函数 /// private Good() { } /// /// 获取静态实例的静态方法 /// /// public static Good GetInstance() { // 使用lock lock(locker) { if (Instance == null) { Instance = new Good(); } return Instance; } } }使用了lock关键字在多线程环境下就可以保证单例了。但是这样修改代码还是有问题,其实只有Instance为null的时候的那次加锁才是有意义的,以后的调用,每个线程都要锁定locker,就会造成性能下降。可以使用双重检查(double-check)解决性能问题。我们对上面的代码进行如下的改造;
class Good{ /// /// 私有的静态变量 /// private static Good Instance = null; private static object locker = new object(); /// /// 私有的构造函数 /// private Good() { } /// /// 获取静态实例的静态方法 /// /// public static Good GetInstance() { // 先检查Instance变量是否为null if(Instance == null) { // 使用lock lock (locker) { if (Instance == null) { Instance = new Good(); } } } return Instance; }}这样只有第一次初始化的时候才会加锁,以后在访问的时候,Instance变量已经不为null了,就直接返回Instance变量了。
感谢各位的阅读!关于"C#中单例模式与多线程怎么用"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
静态
模式
线程
私有
变量
实例
方法
时候
问题
函数
代码
关键
关键字
懒汉
C#
内容
只有
性能
更多
程序
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
安卓软件开发论文有程序
湖州哪家软件开发公司好
开门服务器
工商银行网络安全分级
物流公司网络技术部
数据库工程师有年纪大的吗
各家服务器在哪
无锡软件开发常见问题
数据库如何查询课程信息
网络技术特点有哪些
大闹天宫下载软件开发
bim数据库如何搭建
数据库空表叫什么
软件开发工作如何
寒假期间网络安全保障工作总结
开展网络安全手抄报评比活动
安卓手柄映射软件开发
药店医保网络安全管理制度最新
网络安全教育活动ppt
数据库如何撤销update操作
诸城网络安全
护苗青少年网络安全课堂视频
日本kddi服务器
小学关于网络安全的手抄报
魔兽怀旧服各服务器开放顺序
手机怎么更改服务器端口
资阳跑腿app软件开发
fm补丁数据库文件怎么载入
数据库的内存和磁盘大小吗
江西品牌软件开发一体化