Должен ли я использовать старую синхронизированную коллекцию Vector, ArrayList с синхронизированным доступом или Collections.synchronizedList или какое-либо другое решение для одновременного доступа?Лучший способ контролировать параллельный доступ к коллекциям Java
Я не вижу свой вопрос во взаимосвязанных вопросах и в моем поиске (Make your collections thread-safe? - это не то же самое).
Недавно я должен был сделать отдельные модульные тесты в графических интерфейсах нашего приложения (в основном используя API для создания фреймов, добавления объектов и т. Д.). Поскольку эти операции называются намного быстрее, чем у пользователя, он обнаружил ряд проблем с методами, пытающимися получить доступ к ресурсам, которые еще не созданы или уже удалены.
Особая проблема, происходящая в EDT, произошла от перехода связанного списка видов, изменяя ее в другом потоке (получая исключение ConcurrentModificationException среди других проблем). Не спрашивайте меня, почему это был связанный список, а не простой список массивов (даже меньше, чем у нас вообще 0 или 1 вид внутри ...), поэтому я взял более общий ArrayList в моем вопросе (поскольку он старший кузен).
В любом случае, не очень знакомый с проблемами параллелизма, я немного искал информацию и задавался вопросом, что выбрать между старым (и, возможно, устаревшим) вектором (который имеет синхронизированные операции по дизайну), ArrayList с synchronized (myList) { }
вокруг критического (добавлять/удалять/перемещать операции) или использовать список, возвращенный Collections.synchronizedList (даже не уверен, как использовать последний).
Я, наконец, выбрал второй вариант, потому что другая ошибка дизайна заключалась в том, чтобы разоблачить объект (метод getViewList() ...) вместо предоставления механизмов для его использования.
Но каковы плюсы и минусы других подходов?
[EDIT] Много хороших советов здесь, трудно выбрать. Я выберу более подробные и обеспечивающие ссылки/пищу для размышлений ... :-) Мне нравится Даррон.
Резюмируя:
- Как я и подозревал, Вектор (и его злой двойник, Hashtable, а также, вероятно) в значительной степени устарели, я видел людей, говорил его старый дизайн не так хорошо, как новые коллекции ', за медленностью синхронизации, вызванной даже в среде с одним потоком. Если мы сохраним это, это происходит главным образом из-за того, что старые библиотеки (и части Java API) все еще используют его.
- В отличие от того, что я думал, Collections.synchronizedXxxx не являются более современными, чем Vector (они, похоже, современны для Collections, то есть Java 1.2!), А не лучше, на самом деле. Хорошо знать. Короче говоря, я должен их избегать.
- Ручная синхронизация, похоже, является хорошим решением в конце концов. Могут быть проблемы с производительностью, но в моем случае это не критично: операции, выполняемые с действиями пользователя, небольшая коллекция, не частое использование.
- java.util.concurrent пакет стоит иметь в виду, особенно методы CopyOnWrite.
Я надеюсь, что я получил это право ... :-)
Также см. Http://stackoverflow.com/questions/510632/whats-the-difference-between-concurrenthashmap-and-collections-synchronizedmapm – eljenso