Список <T> одновременное удаление и добавление
Я не уверен, поэтому я подумал, что спрошу. Будет ли удаление и добавление элементов в объект System.Collections.Generic.List<>
небезопасным?
Моя ситуация:
Когда соединение получено, оно добавляется в список, но в то же время есть рабочий, который удаляет мертвые соединения и т.д.
Есть ли проблема? Будет ли lock
делать?
Я также хочу знать, разрешено ли мне использовать блокировку объекта списка с помощью метода Foreach<>
.
Ответы
Ответ 1
Да, добавление и удаление элементов из List<>
не является потокобезопасным, поэтому вам нужно синхронизировать доступ, например, используя lock
.
Помните, что ключевое слово lock
никак не блокирует объект, который вы используете в качестве идентификатора, он только предотвращает одновременный ввод двух потоков в один и тот же блок кода. Вам понадобятся блокировки всего кода, который обращается к списку, используя тот же объект, что и идентификатор.
Ответ 2
На момент вопроса еще не было .NET Framework 4, но люди, столкнувшиеся с проблемой сейчас, должны попытаться использовать коллекции из пространства имен System.Collections.Concurrent для работы с потокобезопасные проблемы
Ответ 3
List<T>
не является потокобезопасным, так что да, вам нужно будет контролировать доступ к списку с помощью блокировки. Если у вас есть несколько потоков, обращающихся к списку, убедитесь, что вы все уважаете блокировку или у вас возникнут проблемы. Лучший способ сделать это - подклассы списка, чтобы блокировка происходила автоматически, иначе вы, скорее всего, в конце концов забудете об этом.
Ответ 4
Собственно, иногда List < > является потокобезопасным, а иногда и нет, согласно Microsoft:
Публичные статические члены этого типа безопасный поток. Любые члены экземпляра не гарантируется безопасность потока.
но эта страница продолжает:
Перечисление через коллекцию по существу не является потокобезопасным процедура. В редком случае, когда перечисление связано с одним или несколькими доступа к записи, единственный способ обеспечить безопасность потока - это блокировка сбор в течение всего перечисление. Чтобы обеспечить сбор для доступа к нескольким потокам для чтении и письме, вы должны выполнить собственную синхронизацию.
Ответ 5
Определенно использование блокировки для конкретного кода делает его потокобезопасным, но я не согласен с ним в текущем сценарии.
Вы можете реализовать метод Synchronized, чтобы сделать потоки коллекции безопасными. Эта ссылка объясняет, почему и как это сделать.
Еще один чисто программный подход упоминается в этой ссылке, хотя я никогда не тестировал его на собственном опыте, но он должен работать.
btw, одна из самых больших проблем заключается в том, что вы пытаетесь сохранить что-то вроде пула соединений? если да, то почему?
Я возвращаю свой ответ. Использование блокировок в лучшем ответе на использование этого метода.