
C#中不需要用锁的线程安全的Singleton设计模式!
发布日期:2021-05-09 04:09:53
浏览次数:17
分类:博客文章
本文共 916 字,大约阅读时间需要 3 分钟。
典型的线程安全的Singleton实现是使用double-checked locking的实现,但是在.NET中我们并不需要使用double-checked locking就可以优雅地实现Singleton模式。
这个优美的Singleton实现基础是.NET对运行期初始化的完整定义。它的优美之处是不需要典型的double-checked locking。
当CLR加载classSingleton的时候,因为Singleton没有staticvariables需要被初始化,所以Singleton的初始化其实什么也没做。而对static classLazyHolder来说,直到它被执行的时候才会被初始化。而static classLazyHolder只有载Singleton.GetInstance()被执行的时候才会执行到。当第一次调用GetInstance()的时候CLR才会加载和初始化LazyHolder这个class。对于LazyHolder class的初始化就是对static variableInstance的初始化。而Instance的初始化就是执行Singleton的privateconstructor。因为.NET保证class的initialization是serial的,就是说在加载和初始化的过程中我们不需要自己做同步。因为初始化过程是一个serial的操作,所以对于后面的GetInstance,我们不需要做任何同步,它也会返回一个正确初始化的Singleton对象。
实现代码:
1 public class Singleton 2 { 3 private static class LazyHolder 4 { 5 public static readonly Singleton Instance = new Singleton(); 6 } 7 8 private Singleton() 9 { 10 } 11 12 public static Singleton GetInstance() 13 { 14 return LazyHolder.Instance; 15 } 16 }
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月26日 17时56分56秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
P3714 [BJOI2017]树的难题 点分治+线段树合并
2021-05-09
插头DP学习笔记
2021-05-09
Scala中的空
2021-05-09
Python基础4(模块 异常)
2021-05-09
k8s之PV、PVC、StorageClass详解
2021-05-09
一文带你认识Docker
2021-05-09
你真的了解Innodb存储引擎?
2021-05-09
FeWeb基础之JavaScript简介
2021-05-09
设计模式学习笔记(二十三:解释器模式)
2021-05-09
使用MongoDB和JSP实现一个简单的购物车系统
2021-05-09
算法笔记_069:Floyd算法简单介绍(Java)
2021-05-09
算法笔记_075:蓝桥杯练习 最短路(Java)
2021-05-09
from flask.ext.wtf import Form导入报错
2021-05-09
Python学习笔记_05:使用Flask+MySQL实现用户登陆注册以及增删查改操作
2021-05-09
Deepin_使用Python+MySQL创建工作日志记录
2021-05-09
dpdk在虚拟机上出错处理
2021-05-09
Nagios 系统监控基本安装配置过程详解
2021-05-09
Macbook 彻彻底底的卸载MySQL
2021-05-09
CSS 字体属性和文本属性的初步了解
2021-05-09
ASP.NET Core 一步步搭建个人网站(4)_主页和登录验证
2021-05-09