5

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列挙型のその他のオプションはPublicationOnlyNoneです。

ExecutionOnlyなぜ選択肢がないのですか?

この場合の動作は、複数のスレッドがlazy.Value. ファクトリ メソッドが完了し、単一の結果がキャッシュされると、多数のスレッドが同時に lazy.Value にアクセスできるようになります (つまり、最初のファクトリ メソッドの後にスレッド セーフはありません)。

4

1 に答える 1

8

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

この列挙は、作成がどのように行われるかを決定するためだけのものです。いつでもValue複数のスレッドからアクセスできます。

于 2012-12-14T00:39:42.540 に答える