Jon Skeetが述べたように、.NET4のSystem.Collections.Concurrent名前空間に「スレッドセーフ」コレクションがあります。
以前の.NETFrameworkバージョンに同時コレクションが存在しない理由の1つは(少なくとも私の推測では)、同時コレクションを使用してもスレッドセーフを保証するのは非常に難しいためです。
(一部のコレクションは、非スレッドセーフコレクションからスレッドセーフコレクションを返すための同期メソッドを提供しているため、これは完全には当てはまりません。そのため、いくつかのスレッドセーフコレクションがあります...)
たとえば、スレッドセーフな辞書があるとします。キーが存在しない場合にのみ挿入したい場合は、最初にコレクションにクエリを実行してキーが存在するかどうかを確認し、キーが存在しない場合は挿入を実行します。ただし、これら2つの操作はスレッドセーフではありませんが、ContainsKeyのクエリとAdd操作の間に、別のスレッドがそのキーの挿入を実行した可能性があるため、競合状態が発生します。
言い換えると、コレクションの操作はスレッドセーフですが、コレクションの使用法は必ずしもそうではありません。この場合、スレッドの安全性を実現するには、従来のロック手法(mutex / monitor / semaphore ...)に戻す必要があります。そのため、同時収集では、マルチスレッドの安全性に関して何も購入されません(ただし、パフォーマンスの点でおそらく劣ります)。 。