コレクションと同期 (スレッド セーフ)
更新 : 2007 年 11 月
既定では、System.Collections のクラスおよびそれに関連する名前空間はスレッド セーフではありません。複数のリーダーがコレクションを確実に読み取ることができますが、コレクションに変更が加えられると、リーダー スレッドを含め、コレクションにアクセスするすべてのスレッドで未定義の結果が発生します。
System.Collections クラスは、次のいずれかのメソッドを使用して、スレッド セーフにすることができます。
Synchronized メソッドを使用してスレッド セーフ ラッパーを作成し、そのラッパーを通じてコレクションに排他的にアクセスします。
そのクラスに Synchronized メソッドがない場合は、SyncRoot プロパティを使用して、そのクラスの派生クラスで Synchronized メソッドを実装します。
コレクションにアクセスするときに、SyncRoot プロパティに対して C# の lock ステートメント (Visual Basic の SyncLock、C++ の Monitor) などのロック機構を使用します。
Synchronized メソッドを実装するときに、派生クラスでは、IsReadOnly プロパティを正しい値を返すようにオーバーライドする必要があります。
Array クラスには Synchronized メソッドが含まれておらず、SyncRoot プロパティはありますが、派生クラスを作成できません。このため、配列は、ロック機構を通じてだけ、スレッド セーフにすることができます。
ジェネリック コレクション クラスに同期メンバはありませんが、Collection<T>、Dictionary<TKey, TValue>、および List<T> などのジェネリック クラスには、非ジェネリックの ICollection インターフェイスから継承される同期メンバを明示的に実装できます。
参照
参照
System.Collections.Specialized