それについて読んだ後LazyInitializer
、それは次のとおりです。
複数のスレッドが競合して初期化する別の初期化モードを提供します。
ここにサンプルがあります:
Expensive _expensive;
public Expensive Expensive
{
get // Implement double-checked locking
{
LazyInitializer.EnsureInitialized (ref _expensive,() => new Expensive());
return _expensive;
}
}
質問1
見つめている :
#A がダブルチェック ロックを実装していると言うのはなぜですか? それは単なるgetプロパティですか?
質問2
#B (ラムダ式) はスレッドセーフですか?
質問#3
そこで、サンプルを見て、この「初期化の競合」について検索しました。
volatile Expensive _expensive;
public Expensive Expensive
{
get
{
if (_expensive == null)
{
var instance = new Expensive();
Interlocked.CompareExchange (ref _expensive, instance, null);
}
return _expensive;
}
}
それから私は考えました:初期化するレースはスレッドセーフですか?
e/g/ 2 つのスレッドが入った場合:
高価なオブジェクトが 2 回作成されます。
もう一度、3つの質問
1) なぜ #A は、ダブルチェック ロックを実装していると言うのですか? それは単なるgetプロパティですか?
2) #B (ラムダ式) はスレッドセーフですか?
3)初期化するレースはスレッドセーフではありません