Может ли кто-нибудь объяснить мне последствия мутирования коллекции в java, которая не является потокобезопасной и используется несколькими потоками?Mutate Non thread safe collections
ответ
Результаты не определены и несколько случайны.
С коллекциями JDK, которые предназначены для сбоя быстро, вы можете получить исключение ConcurrentModificationException. Это действительно единственное следствие, специфичное для безопасности потоков с коллекциями, в отличие от любого другого класса.
Проблемы, которые возникают в основном с резьбовыми небезопасные классов может произойти:
- Внутреннее состояние коллекции может быть поврежден.
- Мутация может показаться успешной, но изменения могут быть не видны другим потокам в любой момент времени. Сначала они могут быть невидимыми и видны позже.
- Изменения могут действительно быть успешными при малой нагрузке, но случайные сбои при большой нагрузке с большим количеством потоков в конфликте.
- Возможны расовые условия, о чем упоминалось в комментарии выше.
Есть много других возможностей, ни один из них не приятен. Хуже всего то, что эти вещи чаще всего проявляются в производстве, когда система подвергается стрессу.
Короче говоря, вы, вероятно, не хотите этого делать.
Инварианты структуры данных не гарантируются.
Например: Если поток 2 выполняет чтение, пока нить 1 добавляет к потоку DS 1, может рассмотреть этот элемент, добавленный, пока поток 2 не видит, что элемент еще добавлен.
Существует много структур данных, которые не являются потокобезопасными, которые по-прежнему будут функционировать (т.е. не бросать) в многопоточной среде, и они могут даже корректно работать при определенных обстоятельствах (например, если вы не выполняете любая запись в структуру данных).
Чтобы полностью понять эту тему, рекомендуется изучить различные классы ошибок, возникающих в параллельных системах: этот короткий документ кажется хорошим началом.
Наиболее распространенный результат это выглядит, как он работает, но не работает все время.
Это может означать, у вас есть проблема, которая
- работает на одной машине, но не по другому.
- работает некоторое время, но что-то явно несвязанные изменения и ваша программа ломается.
- всякий раз, когда у вас есть ошибка, вы не знаете, является ли это проблемой многопоточности или нет, если вы не используете потокобезопасные структуры данных.
Что может случиться;
- редко/случайно получаю сообщение об ошибке и странное поведение
- ваш код входит в бесконечный цикл и перестает работать (HashMap используется, чтобы сделать это)
Единственным вариантом является;
- Ограничить количество состояний, разделяемых между потоками, в идеале - нет.
- Будьте очень осторожны с обновлением данных.
- не полагайтесь на модульные тесты, вы должны понимать, что делает код и быть уверенным, что он будет вести себя правильно во всех возможных ситуациях.
- 1. ThreadLocal и non-thread safe API
- 2. Thread-safe HashTable
- 3. Is boost :: thread thread-safe?
- 4. Ruby, пожалуйста, дайте простой пример NON-thread safe
- 5. Запуск non-thread-safe dll в многопоточном окне http-сервера
- 6. boost smart_ptr non thread safe macro, действительно ли он существует?
- 7. Thread safe Карта очередей
- 8. Thread safe: Экземпляр класса
- 9. thread safe static class
- 10. Thread Safe Servlet
- 11. Thread safe use CallContext.LogicalSetData
- 12. XmlPullParser newPullParse thread safe
- 13. Perl Thread Safe Modules
- 14. .NET DynamicMethod Thread Safe?
- 15. Is String.intern() thread safe
- 16. Thread Safe Вызов
- 17. Spring + Thread safe singletons
- 18. Thread safe, Silverlight
- 19. Guava FluentIterable thread-safe
- 20. Thread-safe CollectionViewSource
- 21. Pymongo script thread safe
- 22. Thread-safe in delphi
- 23. update control thread safe
- 24. using thread safe local_time_r
- 25. Thread-Safe hooking function
- 26. Thread-safe DataSet
- 27. - это System.DirectoryServices.AccountManagement.GroupPrincipal thread safe?
- 28. C++ Thread safe vector.erase
- 29. thread safe nsdictionary
- 30. Thread safe Queue
След. Внутренняя структура коллекции может быть повреждена. – 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