2012-12-14 4 views
5

C#/ .NET 4.0を使用すると、Lazy<T>オブジェクトは次のように宣言できます。 LazyThreadSafetyMode列挙からSystem.Lazy <T>とSystem.Threading.LazyThreadSafetyMode列挙

using System; 
using System.Threading; 
... 
var factory =() => { return new object(); }; 
var lazy = new Lazy<object>(factory, LazyThreadSafetyMode.ExecutionAndPublication); 

その他のオプションPublicationOnlyNoneです。

なぜExecutionOnlyオプションがありますか?

この場合の動作は、複数のスレッドがlazy.Valueを取得しようとしても、ファクトリメソッドが多くても1つのスレッドによって1回呼び出されるということです。ファクトリメソッドが完了し、単一の結果がキャッシュされると、多くのスレッドは同時にlazy.Valueにアクセスできます(つまり、初期ファクトリメソッドの後にスレッドの安全性はありません)。

答えて

8

説明している動作は実質的にLazyThreadSafetyMode.ExecutionAndPublicationです。これにより、複数のスレッドがValueにアクセスできますが、初期化メソッドを実行するスレッドは1つのみです。

この列挙は、作成の仕方を判断するためのものです。複数のスレッドから常にValueにアクセスできます。