.net - Lazy<T> 和线程安全 false 的含义

标签 .net generics thread-safety lazy-evaluation base-class-library

使用 Lazy<T> 的含义是什么?等级和标记 isThreadSafe: false在初始化期间?

在惰性需要访问实例成员而不是静态成员的场景中,惰性是在类构造函数中初始化的,这会自动要求 isThreadSafe: false在所有用途中?

最佳答案

In a scenario where lazy needs to access instance members and not static members where the lazy is initialized inside the class constructor does this automatically require isThreadSafe: false in all usages?



否 - isThreadSafe参数仅影响 Lazy<T> 中的值如何被 build 。

基本上,当您将其设置为 false 时,创建值的方法只会创建该值,将其设置到内部存储中,然后返回该值。

如果您将其设置为 true,则创建将被包裹在 lock 中。 ,防止多个线程创建对象。这映射到 LazyThreadSafetyMode.ExecutionAndPublication .

您也可以指定 PublicationOnly明确地,这将允许创建多个值,但随后使用 Interlocked.CompareExchange内部而不是锁定以确保第一个完成的创建例程的值是用于对象的值。

请注意,这些选项中没有一个对用于计算值的成员有任何影响——它们只影响值本身的创建方式。对创建以外的所有内容的访问始终是线程安全的。如果您正在初始化 Lazy<T>类构造函数中的实例成员,您可以有效地保证不需要同步,因此您可以设置 isThreadSafe为 false - 但这也意味着绝对没有理由使用 Lazy<T>在这种情况下,由于您使用的是显式实例化...

关于.net - Lazy<T> 和线程安全 false 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9876877/

相关文章:

c - C中的多编写器线程安全队列

java - 垃圾收集器 (.net/java) 是实时系统的问题吗?

c# - ADO.NET Entity Framework SaveChanges() 不起作用

.net - Visual Studio 2013 - 将文件移动到另一个路径

java - 找不到符号/无法使用泛型中的 ArrayList 将对象转换为可比较的对象

generics - C# 添加两个泛型值

Java 泛型放在 Map<String, ?扩展列表<String>>

C# - 一个线程无限循环的多线程

java - 静态方法调用是从静态方法线程保存的

c# - 如何在另一个项目中调用一个项目中的类?