3

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

それはSyncRootプロパティの適切な使用ですか?

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

あなたの理由を説明してください。

4

1 に答える 1

6

はい、それがまさにそのSyncRoot物件の目的です。特に、別の「ラッパー」コレクションが作成された場合、おそらく同じものを使用するSyncRootため、誰もが正しく同期できることを意味します。

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

エンキュー/デキューだけでなく、すべての操作に対してロックを解除する必要があることに注意してください。特に、コレクションを反復処理する場合は、その間ずっとロックを保持する必要があります。途中で変更すると、反復子が無効になるためです。

于 2009-07-13T13:57:48.503 に答える