C# Lazy Loading

前言

按需加载对象延迟加载实际是推迟进行建立对象,直到对其调用后才进行建立初始化,延迟(懒加载)的好处是提升系统性能,避免没必要要的计算以及没必要要的资源浪费。数据库

常规有这些状况:安全

  • 对象建立成本高且程序可能不会使用它。 例如,假定内存中有具备 Orders 属性的 Customer 对象,该对象包含大量 Order 对象,初始化这些对象须要数据库链接。 若是用户永远不要求显示 Orders 或在计算中使用该数据,则无需使用系统内存或计算周期来建立它。 经过使用 Lazy 来声明 Orders对象用于迟缓初始化,能够避免在不使用该对象时浪费系统资源。
  • 对象建立成本高,且但愿将其建立推迟到其余高成本操做完成后。 例如,假定程序在启动时加载多个对象实例,可是只需当即加载其中一部分。 能够经过推迟初始化不须要的对象,直到建立所需对象,提高程序的启动性能。(来源官方)

示例

建立用户类多线程

public class User
    {
        public string Name { get; set; }

        public int Age { get; set; }


        public User() {
            this.Name = "Name";
            this.Age = 0;
        }
    }

默认状况下,Lazy 对象是线程安全的。 也就是说,若是构造函数没有指定线程安全性的类型,该函数建立的 Lazy 对象是线程安全的。 在多线程方案中,访问线程安全 Lazy 对象的 Value 属性的第一个线程会为全部线程上的全部后续访问对其初始化,且全部线程共享相同的数据。 所以,哪一个线程初始化对象并不重要,争用条件是良性的。 函数

class Program
    {
        static void Main(string[] args)
        {
            Lazy<User> user = new Lazy<User>();
            ThreadLocal<User> threadLocal = new ThreadLocal<User>();

            if (!user.IsValueCreated)
                Console.WriteLine("The object is not initialized");
            Console.WriteLine(user.Value.Name);
            user.Value.Name = "Name1";
            user.Value.Age = 1;
            Console.WriteLine(user.Value.Name);
            Console.Read();
        }
    }
对象的线程安全性 LazyThreadSafetyMode mode 参数 布尔 isThreadSafe 参数 没有线程安全性参数
彻底线程安全;一次只有一个线程尝试初始化值。 ExecutionAndPublication true 能够。
非线程安全。 None false 不适用。
彻底线程安全;线程争用以初始化值。 PublicationOnly 不适用。 不适用。

其中IsValueCreated属性是个Boolean类型,咱们能够经过此属性去肯定当前对象有没有被初始化性能

调用后,进行了建立操做this

再说说Lazy中几个构造函数,线程

  • public Lazy (bool isThreadSafe)
    isThreadSafe 的布尔参数,该方法参数用于指定是否从多线程访问 Value 属性。 若是想要仅从一个线程访问属性,则传入 false 以获取适度的性能优点。 若是想要从多线程访问属性,则传入 true 以指示 Lazy 实例正确处理争用条件(初始化时一个线程引起异常)。 code

  • public Lazy (LazyThreadSafetyMode mode):提供线程安全模式。orm

  • public Lazy (Func valueFactory)
    lambda 表达式传递给新的 Lazy 对象的构造函数。 下一次访问 Value 属性将致使新 Lazy 的初始化,而且其 Value 属性此后会返回已分配给该属性的新值。 对象

总结

参考:https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization

相关文章
相关标签/搜索