Может ли кто-нибудь объяснить мне последствия мутирования коллекции в java, которая не является потокобезопасной и используется несколькими потоками?Mutate Non thread safe collections
ответ
Результаты не определены и несколько случайны.
С коллекциями JDK, которые предназначены для сбоя быстро, вы можете получить исключение ConcurrentModificationException. Это действительно единственное следствие, специфичное для безопасности потоков с коллекциями, в отличие от любого другого класса.
Проблемы, которые возникают в основном с резьбовыми небезопасные классов может произойти:
- Внутреннее состояние коллекции может быть поврежден.
- Мутация может показаться успешной, но изменения могут быть не видны другим потокам в любой момент времени. Сначала они могут быть невидимыми и видны позже.
- Изменения могут действительно быть успешными при малой нагрузке, но случайные сбои при большой нагрузке с большим количеством потоков в конфликте.
- Возможны расовые условия, о чем упоминалось в комментарии выше.
Есть много других возможностей, ни один из них не приятен. Хуже всего то, что эти вещи чаще всего проявляются в производстве, когда система подвергается стрессу.
Короче говоря, вы, вероятно, не хотите этого делать.
Инварианты структуры данных не гарантируются.
Например: Если поток 2 выполняет чтение, пока нить 1 добавляет к потоку DS 1, может рассмотреть этот элемент, добавленный, пока поток 2 не видит, что элемент еще добавлен.
Существует много структур данных, которые не являются потокобезопасными, которые по-прежнему будут функционировать (т.е. не бросать) в многопоточной среде, и они могут даже корректно работать при определенных обстоятельствах (например, если вы не выполняете любая запись в структуру данных).
Чтобы полностью понять эту тему, рекомендуется изучить различные классы ошибок, возникающих в параллельных системах: этот короткий документ кажется хорошим началом.
Наиболее распространенный результат это выглядит, как он работает, но не работает все время.
Это может означать, у вас есть проблема, которая
- работает на одной машине, но не по другому.
- работает некоторое время, но что-то явно несвязанные изменения и ваша программа ломается.
- всякий раз, когда у вас есть ошибка, вы не знаете, является ли это проблемой многопоточности или нет, если вы не используете потокобезопасные структуры данных.
Что может случиться;
- редко/случайно получаю сообщение об ошибке и странное поведение
- ваш код входит в бесконечный цикл и перестает работать (HashMap используется, чтобы сделать это)
Единственным вариантом является;
- Ограничить количество состояний, разделяемых между потоками, в идеале - нет.
- Будьте очень осторожны с обновлением данных.
- не полагайтесь на модульные тесты, вы должны понимать, что делает код и быть уверенным, что он будет вести себя правильно во всех возможных ситуациях.
След. Внутренняя структура коллекции может быть повреждена. – Andreas
[Носовые демоны.] (Http://www.catb.org/jargon/html/N/nasal-demons.html) То есть демоны могут вылететь из вашего носа. –
Связанные: http://stackoverflow.com/questions/22632552/concurrent-add-on-non-threadsafe-hashset-what-is-the-worst-that-could-happen – Marco13