zoukankan      html  css  js  c++  java
  • C# 延迟初始化 Lazy<T>

    概念:延时初始化重点是延时,用时加载,意思是对象在使用的时候创建而不是在实例化的的时候才创建。
     
    延时加载主要应用的场景:
    • 数据层(ADO.NET或Entity Framework等ORM,Java里面的Hibernate也用到了这种技术)
    • 反射(加载assemblier,type,MEF)
    • 缓存对象,领域实体
    • 单例模式
     
    其二,就是其线程安全问题。用单例模式举例,如下是经常看到的代码:
            public sealed class Singleton
            {
                private static Singleton instance = null;
                private Singleton()
                {
                }
                public static Singleton Instance
                {
                    get
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                        return instance;
                    }
                }
            }
     
    这段代码如果只有一个线程使用,也并不会出现问题;其问题是多线程使用时,两个不同的线程可能都对其进行了访问,如果(instance==null)结果为true,则都创建了实例,这违反了singleton模式。
     
    如下是使用Lazy实现线程安全的解决方案:
     
    public sealed class Singleton
     {
         private static readonly Lazy<Singleton> lazy =
             new Lazy<Singleton>(() => new Singleton());
          
         public static Singleton Instance { get { return lazy.Value; } }
     
         private Singleton()
         {
         }
     } 
     
    关于单例模式各种写法的分析:https://csharpindepth.com/Articles/Singleton
  • 相关阅读:
    BSP与HAL关系(转)
    [Advanced Algorithm]
    [Advanced Algorithm]
    [Advanced Algorithm]
    [Intermediate Algorithm]
    [Intermediate Algorithm]
    [Intermediate Algorithm]
    [Intermediate Algorithm]
    [Intermediate Algorithm]
    [Advanced Algorithm]
  • 原文地址:https://www.cnblogs.com/Juning/p/11549080.html
Copyright © 2011-2022 走看看