Проблема создания многопоточной безопасной коллекции не проста. Конечно, достаточно просто создать коллекцию, которая может быть изменена / прочитана из нескольких потоков без повреждения состояния. Но гораздо сложнее спроектировать коллекцию, которая будет использоваться, учитывая, что она обновлена из нескольких потоков. Возьмите следующий код в качестве примера.
if ( myCollection.Count > 0 ) {
var x = myCollection[0];
}
Предположим, что myCollection является потокобезопасной коллекцией, в которой добавления и обновления гарантированно не повреждают состояние. Этот код не является потокобезопасным и является условием гонки.
Почему? Несмотря на то, что myCollection безопасен, нет никакой гарантии, что не произойдут изменения между двумя вызовами метода myCollection: namedly Count и indexer. Другой поток может войти и удалить все элементы между этими вызовами.
Этот тип проблемы делает использование коллекции такого типа, откровенно говоря, кошмаром. Вы никогда не сможете позволить, чтобы возвращаемое значение одного вызова влияло на последующий вызов коллекции.
РЕДАКТИРОВАТЬ
Я расширил это обсуждение в недавнем сообщении в блоге: http://blogs.msdn.com/jaredpar/archive/2009/02/11/why-are-thread-safe-collections-so-hard.aspx