C#中不需要用锁的线程安全的Singleton设计模式!
典型的线程安全的Singleton实现是使用double-checked locking的实现,但是在.NET中我们并不需要使用double-checked locking就可以优雅地实现Singleton模式。
这个优美的Singleton实现基础是.NET对运行期初始化的完整定义。它的优美之处是不需要典型的double-checked locking。
当CLR加载class
Singleton的时候,因为Singleton没有static
variables需要被初始化,所以Singleton的初始化其实什么也没做。而对static class
LazyHolder来说,直到它被执行的时候才会被初始化。而static class
LazyHolder只有载Singleton.GetInstance()被执行的时候才会执行到。当第一次调用GetInstance()的时候
CLR才会加载和初始化LazyHolder这个class。对于LazyHolder class的初始化就是对static variable
Instance的初始化。而Instance的初始化就是执行Singleton的private
constructor。因为.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 }
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 }
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步