使用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
枚举中的其他选项为PublicationOnly
和None
。
为什么没有ExecutionOnly
选项?
在这种情况下的行为是,即使多个线程试图获得lazy.Value
,单个线程最多也会调用一次工厂方法。一旦工厂方法完成并且单个结果被缓存,许多线程将能够同时访问lazy.Value(即,在初始工厂方法之后没有线程安全性)。
答案 0 :(得分:8)
您所描述的行为实际上是LazyThreadSafetyMode.ExecutionAndPublication
。这允许多个线程访问Value
,但只有一个线程可以运行初始化方法。
此枚举仅用于确定创建的方式 - 您始终可以从多个线程访问Value
。