System.Lazy <t>和System.Threading.LazyThreadSafetyMode枚举</t>

时间:2012-12-14 00:30:49

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

使用C#/ .NET 4.0,Lazy<T>对象可以声明如下。

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(即,在初始工厂方法之后没有线程安全性)。

1 个答案:

答案 0 :(得分:8)

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

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