Вообще "потокобезопасная коллекция" - это не постановка задачи; нужно точно знать, где и для чего эта коллекция будет использоваться, чтобы выбрать оптимальное решение.
В основном, все экземпляры этой коллекции будут представлять собой нечто, что записывается один раз, и впоследствии практически никогда не меняется, зато чтение происходит несколько раз в секунду.
На самом деле там довольно ветвистая структура из коллекций, где каждый элемент коллекции имеет свою коллекцию, а каждый элемент этой коллекции... и так далее...
Добавлено через 13 минут и 41 секунду:если один поток читает коллекцию через enumerator, а другой в это время потокобезопасно пишет в неё, enumerator сломается, и читающий поток упадёт.
а если один читает коллекцию через оператор foreach, предварительно ее заблокировав, а второй, тоже заблокировав, пишет (не в оболочку, а в саму коллекцию), foreach умрет?
Добавлено через 40 минут и 8 секунд:И, кстати, какую роль тогда во всем этом великолепии играет член SyncRoot класса ArrayList?
Я правильно понимаю, что в приведенном коде будет корректнее исправить во всех методах, где используется перебор элементов, foreach (T item in this) на foreach (T item in Synchronized(this))?