前言
按需加载对象延迟加载实际是推迟进行建立对象,直到对其调用后才进行建立初始化,延迟(懒加载)的好处是提升系统性能,避免没必要要的计算以及没必要要的资源浪费。数据库
常规有这些状况:安全
示例
建立用户类多线程
public class User { public string Name { get; set; } public int Age { get; set; } public User() { this.Name = "Name"; this.Age = 0; } }
默认状况下,Lazy
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
public Lazy (LazyThreadSafetyMode mode):提供线程安全模式。orm
public Lazy (Func
lambda 表达式传递给新的 Lazy
总结
参考:https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization