2010-12-08 9 views
1

私はLazy <T>(bool)コンストラクタに関するMicrosoftのドキュメントを読んでいると混乱します。Lazy (bool)コンストラクタドキュメント

でisThreadSafe

パラメータとして記載されている複数のスレッドが同時に使用可能なこのインスタンスを作成する場合はtrue。 falseを指定すると、一度に1つのスレッドだけがインスタンスを使用できるようになります。

私は通常、アクセサに記述したコードがある場合:

If _rulesCache Is Nothing Then 

    SyncLock (_lockRulesCache) 

     If _rulesCache Is Nothing Then 

      _rulesCache = New RulesCache() 

     End If 

    End SyncLock 

End If 

Return _rulesCache 

私は怠惰なタイプのコンストラクタでTrueまたはFalseを使用しますか?

Private _rulesCache As New Lazy(Of RulesCache)(**?**) 

だから私のアクセサは次のようになります。

Return _rulesCache.Value 

1)オブジェクトが作成されると、それは内部的に複数のスレッドのアクセスを処理することができます。

2)複数のスレッドがアクセサーに同時に近づき、オブジェクトが存在しない場合は、一度しか作成されないことを確認する必要があります。

ドキュメントによれば、文1はパラメータが偽であることを意味します。ステートメント2は、パラメーターが真で​​なければならないことを意味します。

私はこれを過度に考えているように感じています。それは単に私をもっと混乱させてしまいます。または上記の2つのステートメントは実際には互いに不安定です。オブジェクトのインスタンス化を管理するために手動でロックするだけでいいですか?

答えて

2

ステートメント2が望ましい解釈です。このパラメータは、遅延初期化が完了した後のオブジェクトの動作には影響しません。 2つのスレッドが誤って競合して2回インスタンス化されるのを防ぐだけです。興味があるなら、リフレクターでそれを確認することができます。

+0

したがって、isThreadSafeの値は、Lazyのインスタンスが複数のスレッドを同時にインスタンス化しようとするか(true)、単一スレッド環境で使用されているかどうかを解釈する必要がありますそれをインスタンス化する単一のスレッド(false)はい? – ulty4life

+0

はい、正確な要約です。 – mquander