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);
その他のオプションPublicationOnly
とNone
です。
なぜExecutionOnly
オプションがありますか?
この場合の動作は、複数のスレッドがlazy.Value
を取得しようとしても、ファクトリメソッドが多くても1つのスレッドによって1回呼び出されるということです。ファクトリメソッドが完了し、単一の結果がキャッシュされると、多くのスレッドは同時にlazy.Valueにアクセスできます(つまり、初期ファクトリメソッドの後にスレッドの安全性はありません)。