2016-08-16 4 views
1

Может ли кто-нибудь объяснить мне последствия мутирования коллекции в java, которая не является потокобезопасной и используется несколькими потоками?Mutate Non thread safe collections

+1

След. Внутренняя структура коллекции может быть повреждена. – Andreas

+1

[Носовые демоны.] (Http://www.catb.org/jargon/html/N/nasal-demons.html) То есть демоны могут вылететь из вашего носа. –

+0

Связанные: http://stackoverflow.com/questions/22632552/concurrent-add-on-non-threadsafe-hashset-what-is-the-worst-that-could-happen – Marco13

ответ

0

Результаты не определены и несколько случайны.

С коллекциями JDK, которые предназначены для сбоя быстро, вы можете получить исключение ConcurrentModificationException. Это действительно единственное следствие, специфичное для безопасности потоков с коллекциями, в отличие от любого другого класса.

Проблемы, которые возникают в основном с резьбовыми небезопасные классов может произойти:

  • Внутреннее состояние коллекции может быть поврежден.
  • Мутация может показаться успешной, но изменения могут быть не видны другим потокам в любой момент времени. Сначала они могут быть невидимыми и видны позже.
  • Изменения могут действительно быть успешными при малой нагрузке, но случайные сбои при большой нагрузке с большим количеством потоков в конфликте.
  • Возможны расовые условия, о чем упоминалось в комментарии выше.

Есть много других возможностей, ни один из них не приятен. Хуже всего то, что эти вещи чаще всего проявляются в производстве, когда система подвергается стрессу.

Короче говоря, вы, вероятно, не хотите этого делать.

0

Инварианты структуры данных не гарантируются.

Например: Если поток 2 выполняет чтение, пока нить 1 добавляет к потоку DS 1, может рассмотреть этот элемент, добавленный, пока поток 2 не видит, что элемент еще добавлен.

Существует много структур данных, которые не являются потокобезопасными, которые по-прежнему будут функционировать (т.е. не бросать) в многопоточной среде, и они могут даже корректно работать при определенных обстоятельствах (например, если вы не выполняете любая запись в структуру данных).

Чтобы полностью понять эту тему, рекомендуется изучить различные классы ошибок, возникающих в параллельных системах: этот короткий документ кажется хорошим началом.

http://pages.cs.wisc.edu/~remzi/OSTEP/threads-bugs.pdf

0

Наиболее распространенный результат это выглядит, как он работает, но не работает все время.

Это может означать, у вас есть проблема, которая

  • работает на одной машине, но не по другому.
  • работает некоторое время, но что-то явно несвязанные изменения и ваша программа ломается.
  • всякий раз, когда у вас есть ошибка, вы не знаете, является ли это проблемой многопоточности или нет, если вы не используете потокобезопасные структуры данных.

Что может случиться;

  • редко/случайно получаю сообщение об ошибке и странное поведение
  • ваш код входит в бесконечный цикл и перестает работать (HashMap используется, чтобы сделать это)

Единственным вариантом является;

  • Ограничить количество состояний, разделяемых между потоками, в идеале - нет.
  • Будьте очень осторожны с обновлением данных.
  • не полагайтесь на модульные тесты, вы должны понимать, что делает код и быть уверенным, что он будет вести себя правильно во всех возможных ситуациях.