使用 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/