【问题标题】:System.Lazy<T> and the System.Threading.LazyThreadSafetyMode EnumerationSystem.Lazy<T> 和 System.Threading.LazyThreadSafetyMode 枚举
【发布时间】:2012-12-14 00:30:48
【问题描述】:

使用 C#/.NET 4.0,Lazy&lt;T&gt; 对象可以声明如下。

using System;
using System.Threading;
...
var factory = () => { return new object(); };
var lazy = new Lazy<object>(factory, LazyThreadSafetyMode.ExecutionAndPublication);

LazyThreadSafetyMode 枚举中的其他选项是 PublicationOnlyNone

为什么没有ExecutionOnly 选项?

这种情况下的行为是工厂方法最多被单个线程调用一次,即使多个线程尝试获取lazy.Value。一旦工厂方法完成并缓存了单个结果,许多线程将能够同时访问lazy.Value(即在初始工厂方法之后没有线程安全)。

【问题讨论】:

    标签: c# .net-4.0 lazy-initialization


    【解决方案1】:

    您描述的行为实际上是LazyThreadSafetyMode.ExecutionAndPublication。这允许多个线程访问Value,但只有一个线程可以运行初始化方法。

    此枚举仅用于确定创建方式 - 您始终可以从多个线程访问 Value

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 2014-01-27
      相关资源
      最近更新 更多