概念:延时初始化重点是延时,用时加载,意思是对象在使用的时候创建而不是在实例化的的时候才创建。
 
延时加载主要应用的场景:
  • 数据层(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

C# 延迟初始化 Lazy<T>的更多相关文章

  1. 不要使用 Dispatcher.Invoke,因为它可能在你的延迟初始化 Lazy 中导致死锁

    WPF 中为了 UI 的跨线程访问,提供了 Dispatcher 线程模型.其 Invoke 方法,无论在哪个线程调用,都可以让传入的方法回到 UI 线程. 然而,如果你在 Lazy 上下文中使用了 ...

  2. C#性能优化:延迟初始化Lazy<T>

    1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...

  3. 延迟初始化Lazy

    延迟初始化出现于.NET 4.0,主要用于提高性能,避免浪费计算,并减少程序内存要求.也可以称为,按需加载. 基本语法: Lazy<T> xx = new Lazy<T>(); ...

  4. C#性能优化:延迟初始化Lazy

    1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...

  5. C#延迟初始化Lazy<T>

    1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...

  6. Python中__get__, __getattr__, __getattribute__的区别及延迟初始化

    本节知识点 1.__get__, __getattr__, __getattribute__的区别 2.__getattr__巧妙应用 3.延迟初始化(lazy property) 1.__get__ ...

  7. Java - 延迟初始化

    延迟初始化(lazy initialization),也就是在真正被使用的时候才开始初始化的技巧. 不论是静态还是实例,都可以进行延迟初始化. 其本质是初始化开销和访问开销之间的权衡. 毕竟是一种优化 ...

  8. C#性能优化之Lazy<T> 实现延迟初始化

    在.NET4.0中,可以使用Lazy<T> 来实现对象的延迟初始化,从而优化系统的性能.延迟初始化就是将对象的初始化延迟到第一次使用该对象时.延迟初始化是我们在写程序时经常会遇到的情形,例 ...

  9. Lazy<T>延迟初始化

    延迟初始化:Lazy<T> 1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延 ...

随机推荐

  1. Json序列化指定输出字段 忽略属性

    DataContract 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务 ...

  2. HTML5 地理位置定位API(4)

    地理定位(geolocation)是最令人兴奋,而且得到了广泛支持的一个新API.通过这套API, JavaScript代码能够访问到用户的 当前位置信息.当然,访问之前必须得到用户的明确许可,即同意 ...

  3. word 2010中设置默认粘贴为 只保留文本粘贴【visio也适用于快捷键方式】

    VISIO也适用如下方式: 3. 当然也可以直接是 Ctrl + Alt + V打开选择性粘贴选项卡 来选择其中某项来粘贴也是可以的 转: word 2010中设置默认粘贴为 只保留文本粘贴 2012 ...

  4. tcpdump抓包代码

    tcpdump - tcp[:]=:]=0x4854 or tcp 抓出来的包可以导入wireshark分析 以上代码曾经在ios越狱机器上使用,用于抓包,具体也记不起来了 导入wireshark效果

  5. (十一)Centos之帮助命令

    帮助命令man  (manual) 比如我们可以看下man命令的解释 [root@localhost ~]# man man MAN(1)                               ...

  6. AssetsLibrary 实现访问相册,选取多张照片显示

    #import "ViewController.h" #import <AssetsLibrary/AssetsLibrary.h> /** * ALAssetsLib ...

  7. END使用

    [root@bogon ~]# cat d.sh #!/bin/bash#. /etc/init.d/functionscat <<END+------------------------ ...

  8. 【数据库开发】Redis数据库设置密码

    redis配置密码1.通过配置文件进行配置yum方式安装的redis配置文件通常在/etc/redis.conf中,打开配置文件找到 ? 1 #requirepass foobared 去掉行前的注释 ...

  9. 优化apk的odex处理

    前文讲到了apk的反编译流程,但在有的情况下会出现apk的资源文件和代码文件分开的情况,这种情况会出现如下目录结构,并且在apk文件里面并没有dex文件. 所需工具 smali.jar和baksmal ...

  10. 各种 Java Thread State 分析

    转自:https://www.cnblogs.com/zhengyun_ustc/archive/2013/03/18/tda.html 1,线程状态为“waiting for monitor ent ...