2012-12-14 34 views
5

使用C#/ .NET 4.0,Lazy<T>對象可以聲明如下。System.Lazy <T>和System.Threading.LazyThreadSafetyMode枚舉

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(即在初始工廠方法之後沒有線程安全性)。

回答

8

您所描述的行爲實際上是LazyThreadSafetyMode.ExecutionAndPublication。這允許多個線程訪問Value,但只有一個線程可以運行初始化方法。

此枚舉僅用於確定創建的方式 - 您始終可以從多個線程訪問Value