C#中Lazy<T> 泛型类(延迟初始化对象)

在 C# 中,Lazy<T> 是一个泛型类,用于延迟初始化对象。它提供了一种方便的方式来推迟对象的创建,直到首次访问该对象时。

Lazy<T> 类有一个重要的特性,即它使用了线程安全的方式进行延迟初始化。这意味着即使在多线程环境下,多个线程同时访问 Lazy<T> 对象,也只会有一个线程执行初始化操作,并且所有线程最终都会获取到相同的初始化结果。

下面是一个简单的示例,演示了如何使用 Lazy<T> 来延迟初始化对象:

class Program
{static void Main(string[] args){Lazy<ExpensiveObject> lazyObject = new Lazy<ExpensiveObject>();// 当需要访问 ExpensiveObject 对象时,进行初始化ExpensiveObject expensiveObject = lazyObject.Value;// 后续访问时,直接使用已初始化的对象expensiveObject.DoSomething();}
}class ExpensiveObject
{public ExpensiveObject(){// 对象的初始化操作Console.WriteLine("ExpensiveObject is being initialized.");}public void DoSomething(){Console.WriteLine("ExpensiveObject is doing something.");}
}

在上述示例中,ExpensiveObject 是一个代表昂贵对象的类。在 Main 方法中,我们创建了一个 Lazy<ExpensiveObject> 对象 lazyObject,用于延迟初始化 ExpensiveObject。当我们需要使用 ExpensiveObject 对象时,通过访问 lazyObject.Value 来触发对象的初始化。在初始化过程中,ExpensiveObject 的构造函数被调用。后续的访问中,我们可以直接使用已初始化的对象。

需要注意的是,Lazy<T> 对象的初始化是延迟进行的,只有在首次访问 Value 属性时才会发生。如果初始化过程中发生异常,后续的访问会继续引发同样的异常。如果需要在初始化期间进行一些额外的逻辑处理,可以使用 Lazy<T> 的构造函数重载或者通过 Lazy<T> 的事件来实现。

Lazy<T> 类是 C# 中一种方便且线程安全的机制,用于延迟初始化对象,并且在多线程环境中表现良好。它能够提高性能和资源利用率,只在需要时才创建和初始化对象。


Lazy<T> 类在底层使用了 System.Threading.Lazy<T> 类来实现延迟初始化的功能。System.Threading.Lazy<T> 类是 .NET Framework 提供的线程安全的延迟初始化类。

System.Threading.Lazy<T> 类使用了一种名为双重检查锁定(double-checked locking)的模式来确保只有一个线程执行初始化操作,并且其他线程在初始化完成之前会等待。这种模式结合了性能和线程安全性。

下面是 System.Threading.Lazy<T> 类的简化版本的概念实现:

class Lazy<T>
{private T value;private Func<T> valueFactory;private bool isValueCreated;private object lockObject = new object();public Lazy(Func<T> valueFactory){this.valueFactory = valueFactory;}public T Value{get{if (!isValueCreated){lock (lockObject){if (!isValueCreated){value = valueFactory();isValueCreated = true;}}}return value;}}
}

在上述简化的实现中,Lazy<T> 类包含了一个私有变量 value 用于存储延迟初始化后的值。valueFactory 是一个委托,用于在首次访问 Value 属性时进行对象的初始化操作。isValueCreated 标记了是否已经创建了 value

当首次访问 Value 属性时,会先进行一个快速的检查,如果 isValueCreatedfalse,则进入锁定的代码块。在锁定的代码块内,再次检查 isValueCreated,以防止其他线程已经初始化了对象。如果 isValueCreated 仍为 false,则使用 valueFactory 委托创建对象,并将其赋值给 value。最后,将 isValueCreated 设置为 true,表示对象已经创建。

在多线程环境下,多个线程同时访问 Value 属性时,只有一个线程能够通过双重检查锁定的方式执行初始化操作,其他线程会等待初始化完成。这种方式保证了线程安全性,并且只有在需要时才进行初始化操作,避免了不必要的开销。

需要注意的是,System.Threading.Lazy<T> 类还提供了其他重载的构造函数和属性,使您可以自定义初始化过程、指定线程安全性等。这些细节在实际使用时可以根据需求进行调整。

总而言之,Lazy<T> 类在底层使用了 System.Threading.Lazy<T> 类来实现延迟初始化的功能。它使用双重检查锁定模式确保线程安全,并提供了方便的机制来推迟对象的创建,只在需要时才进行初始化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/657466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

彻底解决 MAC Android Studio gradle async 时出现 “connect timed out“ 问题

最近在编译一个比较老的项目&#xff0c;git clone 之后使用 async 之后出现一下现象&#xff1a; 首先确定是我网络本身是没有问题的&#xff0c;尝试几次重新 async 之后还是出现问题&#xff0c;网上找了一些方法解决了本问题&#xff0c;以此来记录一下问题是如何解决的。 …

【Tomcat与网络5】再论Tomcat的工作过程与两种经典的设计模式

前面两篇&#xff0c;我们重点分析了Tomcat的容器和连接器的基本设计&#xff0c;今天我们来看一下两个机构如何在service的调度下进行协同工作的。 目录 1.模板模式与Tomcat的重用性设计 2.观察者模式与Tomcat可扩展性设计 1.模板模式与Tomcat的重用性设计 首先&#xff0…

油分离器的介绍

压缩机的排气中带有冷冻机油&#xff0c;这些冷冻机油如果随制冷剂蒸汽进入冷凝器、蒸发器后将 在传热表面形成油膜&#xff0c;从而影响换热效果。因此通常在压缩机与冷凝器之间装设油分离器&#xff0c;用 来分离制冷剂蒸汽中挟带的冷冻机油。在氟利昂制冷系统中&#xff0c;…

读AI3.0笔记10_读后总结与感想兼导读

1. 基本信息 AI 3.0 (美)梅拉妮米歇尔 著 四川科学技术出版社,2021年2月出版 1.1. 读薄率 书籍总字数355千字&#xff0c;笔记总字数33830字。 读薄率33830355000≈9.53% 1.2. 读厚方向 千脑智能 脑机穿越 未来呼啸而来 虚拟人 新机器人 如何创造可信的AI 新机器智…

FY-SA-20237·8-KidsNeedBetterPlacesToPlay

Translated from the Scientific American, July/August 2023 issue. Kids Need Better Places to Play To get children moving more, we must invest in safe areas for outdoor fun. ——By the Editors 翻译&#xff1a;为了让孩子们更多地运动&#xff0c;我们必须为安全…

sklearn 计算 tfidf 得到每个词分数

from sklearn.feature_extraction.text import TfidfVectorizer# 语料库 可以换为其它同样形式的单词 corpus [list(range(-5, 5)),list(range(-6,4)),list(range(12)),list(range(13))]# corpus [ # [Two, wrongs, don\t, make, a, right, .], # [The, pen, is, might…

CGAL5.4.1 边塌陷算法

目录 1、使用曲面网格的示例 2、使用默认多面体的示例 3、使用丰富多面体的示例 主要对1、使用曲面网格的示例 进行深度研究 CGAL编译与安装CGAL安装到验证到深入_cgal测试代码-CSDN博客 参考资料CGAL 5.4.5 - Triangulated Surface Mesh Simplification: User Manual …

云原生 k8s 可能使用到的端口整理【不定期更新】

k8s 因为涉及到的组件太多了&#xff0c;所以端口有很多&#xff0c;这里整理了日常所接触的接口&#xff0c;后续有新的再更新。 如果是通过公网 IP 进行安装的时候需要根据实际情况有选择的进行放开&#xff1b;一般只有云厂商会提供公网 IP 访问&#xff0c;自建的话不建议 …

通过WSL2来实现Windows10/11的深度学习模型GPU加速,TensorFlow项,Jupyter及其插件安装,CQF心得,金融量化

通过WSL2来实现TF的GPU加速 为什么要用WSL&#xff08;Windows Subsystem Linux&#xff09;安装WSL2&#xff0c;miniconda&#xff0c;cuda&#xff0c;cudnn&#xff0c;TA-Lib安装 WSL2安装 Miniconda3安装 CUDA安装 cuDNN安装 TensorFlow 库安装 TA-Lib 库安装其它CQF及金…

Inventor 2024下载安装教程,免费使用,附安装包和工具,流程简单,小白也能轻松搞定

前言 Inventor是一款专业的三维可视化实体建模软件&#xff0c;Inventor.主要用于各类二维机械制图、三维制图的设计和开发等操作&#xff0c;可以广泛地应用于零件设计、钣金设计、装配设计等领域。 准备工作 1、Win7及以上系统 2、提前准备好 Inventor 2024 安装包 没有…

C++语法基础及入门使用案例

C语法基础及使用案例 1. 第一个C程序 #include <iostream> using namespace std; int main() {cout << "Hello World" << endl; }2. 输出不同类型&#xff08;十进制、八进制、十六进制、浮点型、字符型&#xff09; #include <iostream> …

【操作系统】知识补漏

进程之间的关系&#xff1a; 1.独立 2.交互关系 2.1 竞争关系----互斥锁【解决】 2.2 协作关系----信号量【解决】 Linux调度策略的过程 linux 分为两个模型&#xff1a; 1 Normal 模式 sched_other[RR] 2. real-time 模式 real -time模式的进程优先级永远高于Normal模型 查…

springboot3整合swagger

JDK17 SpringBoot3.2.2 引入依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.1.0</version> </dependency>现在已经可以使用&#xff0c;访问 …

2401Idea用GradleKotlin编译Java控制台中文出乱码解决

解决方法 解决方法1 在项目 build.gradle.kts 文件中加入 tasks.withType<JavaCompile> {options.encoding "UTF-8" } tasks.withType<JavaExec> {systemProperty("file.encoding", "utf-8") }经测试, 只加 tasks.withType<…

正则表达式(RE)

什么是正则表达式 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;。正则表达式通常被用来检索、替换那些符合某个规则的文本 正则表达式的作用 验证数据的有效性替换文本内容从字符串中提取子字符串 匹配单个字符 字符功能.匹配任意1个…

0130-2-秋招面试—HTML篇

2023 HTML面试题 1.src和href的区别 scr用于替换当前元素&#xff0c;href用于在当前文档和外部资源之间建立联系。 <script src"main.js"></script><link href"style.css" rel"stylesheet" />2.对HTML语义化的理解 根据内…

数列极限一基础篇-重点习题记录

海涅定理与函数连续 首先证明函数在X0处连续&#xff1a; X 利用归结原则&#xff08;海涅定理&#xff09;证明函数 在x&#xff01;0处不连续&#xff1a; 收获&#xff1a; 数列极限单调有界应用 题1 题2 题3

8个硬核的python入门项目

大家好&#xff0c;Python是一种通用编程语言&#xff0c;被广泛用于Web开发、数据分析、机器学习和自动化。提高Python技能的最佳方式之一是从事实际项目。本文将探索8个带有代码的Python项目&#xff0c;其涵盖了各种主题和难度级别&#xff0c;帮助大家增强编程能力。 1. U…

华为---STP(二)---STP报文和STP端口状态

目录 1. STP报文简介 1.1 Configuration BPDU 1.2 TCN BPDU 2. STP交换机端口状态 2.1 STP交换机端口状态表 2.2 STP交换机端口状态迁移过程图 2.3 STP交换机端口状态变化举例说明 3 引起的STP网络拓扑改变的示例 3.1 根桥出现故障 3.2 有阻塞端口的交换机根端口所在…

web worker

&#xff08;1&#xff09;同源限制 分配给 Worker 线程运行的脚本文件&#xff0c;必须与主线程的脚本文件同源。&#xff08;2&#xff09;DOM 限制 Worker 线程所在的全局对象&#xff0c;与主线程不一样&#xff0c;无法读取主线程所在网页的 DOM 对象&#xff0c;也无法使…