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
  • 相关阅读:
    判断url的正则表达式
    将Excel数据导入MySql
    需要记一下的
    java笔记
    禁用cookie后
    smarty框架块函数
    php Smarty date_format [格式化时间日期]
    mysql 笔记
    笔记 php.ini配置文件中magic_quotes_gpc, magic_quotes_runtime的作用是什么?应该开启还是关闭?
    php
  • 原文地址:https://www.cnblogs.com/Juning/p/11549080.html
Copyright © 2011-2022 走看看