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