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 にアクセスできるようになります (つまり、最初のファクトリ メソッドの後にスレッド セーフはありません)。