5

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

4

1 回答 1

8

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

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

于 2012-12-14T00:39:42.540 回答