zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    你是一直认为 count(1) 比 count(*) 效率高么?
    秒杀系统是如何防止超卖的?
    百亿流量微服务网关的设计与实现
    中台
    Token 、Cookie、Session
    HyperLedger Fabric 1.4 区块链应用场景(3.1)
    HyperLedger Fabric 1.4 区块链工作过程(2.3)
    HyperLedger Fabric 1.4 区块链技术原理(2.2)
    HyperLedger Fabric 1.4 区块链技术定义(2.1)
    HyperLedger Fabric 1.4 区块链技术发展(1.3)
  • 原文地址:https://www.cnblogs.com/kevinwan/p/CSharpSingleton.html
Copyright © 2011-2022 走看看