2009-07-13 8 views
3

同期キューを作成し、そのキューのSyncRootプロパティでEnqueue/Dequeueメソッドを呼び出すときにSyncLockを使用しています。これらのメソッドは、標準のプロデューサ/コンシューマクラスのインスタンスから呼び出されます。SyncRock on SyncRoot

これは、SyncRootプロパティを適切に使用することですか?

各クラスでプライベート共有オブジェクトを作成し、代わりにロックする方がよいでしょうか?

あなたの推論を説明してください。

答えて

5

はい、これはまさにSyncRootプロパティのためです。特に、別の「ラッパー」コレクションが作成された場合は、同じSyncRootが使用されるため、誰もが正しく同期できます。

あなた独自のロックオブジェクトを作成することができ、そしてそれは絶対確実同時にロックされ、他の誰ということになるだろう - それはまた、他のコードが安全に同じコレクションでは動作しませんことができることを意味します。それは本当にシナリオに依存します - 同じコレクションを使用できる他のコードですか?他のコードはあなたのコントロール下にありますか?

エンキュー/デキューだけでなく、すべて操作のロックを解除する必要があります。特に、コレクションを反復したい場合は、中間の変更がイテレータを無効にするため、その時間全体にわたってロックを保持する必要があります。