Скажем, у меня есть List
объектов, которые изменяются только одним потоком (поток может добавлять или удалять объекты), а другой поток иногда использует поток api из приведенного выше коллектора для выполнения некоторых операций с потоком он и в конце (нетерпеливая операция) возвращает новую коллекцию. Является ли этот сценарий безопасным потоком? ведь только один поток обновляет коллекцию.Java 8 поток из модифицированной коллекции
ответ
Это полностью зависит от вашего источника List
осуществления. С ArrayList
вы может получить ConcurrentModificationException
(или может получить поврежденные данные или какое-либо другое исключение: см. Комментарий). С помощью CopyOnWriteArrayList
вы можете безопасно использовать потоковые операции: они будут видеть состояние списка, которое было актуальным при создании потока. В любом случае вы должны проверить документацию по методу spliterator()
соответствующей коллекции, чтобы убедиться, что ее можно использовать в параллельной среде.
Вы * можете * получить 'ConcurrentModificationException', так как он будет основан на принципе« наилучшего усилия ». Вы * можете * молча получить поврежденные данные. Или другое исключение, которое не говорит вам, что оно было вызвано одновременной манипуляцией, например. «IndexOutOfBoundsException». Вы * можете * уйти со сломанным кодом в течение долгого времени, прежде чем внезапно возникнут побочные проблемы ... – Holger
@ Хольджер, хорошая точка. Отредактировал ответ. –
Вы должны получить исключение параллельной модификации, поскольку вы одновременно читаете и записываете эту коллекцию.
Что делать, если коллекция допускает одновременные изменения? –
- 1. Java 8 Поток groupingby
- 2. Java 8 поток API: получить первый элемент коллекции найден
- 3. Java 8 поток из репозитория JPA
- 4. Как создать поток Java 8 из итератора?
- 5. Java 8 поток и parallelStream
- 6. Рефакторинг в Java 8 поток
- 7. Java 8 поток - .max() с дубликатами
- 8. Java 8 поток - или состояние
- 9. Java 8 Коллекции Список объединений
- 10. Java 8 flatmap, поток, собирать
- 11. Java 8 поток более простой
- 12. Java 8 поток внедриться объект
- 13. Java 8 поток - сумма объектов
- 14. Java 8 поток в файл
- 15. рефакторинга Java код 8 поток
- 16. Java 8 поток в среднем для поплавка
- 17. поток Java Lambda в разные коллекции
- 18. Java 8 поток api на основе ключей
- 19. Java 8 stream объединяет две разные коллекции
- 20. Условно добавить операцию в поток Java 8
- 21. Сняв элемент из коллекции с помощью Java 8
- 22. возвращает значение сразу из коллекции java 8 streams
- 23. Как создать BigDecimal поток из массива String в Java 8?
- 24. Как создать поток Java 8 из System.in/System.console()?
- 25. Производите поток из потока и элемент, Java 8
- 26. Java 8 groupingBy в общей коллекции
- 27. Java 8 Потоки изменяют значения коллекции
- 28. Идиотерапия идиоматической коллекции в Java 8
- 29. Java 8 Lambda - коллекция фильтров другой коллекции
- 30. Лучший способ собрать поток Java-8 в Guava ImmutableList
Я так не думаю ... что произойдет, если один поток удалит элемент, а другой попытается его прочитать? Возможно, я ошибаюсь, потому что я не уверен, как потоки работают под капотом. – npinti
Это не потокобезопасный сценарий, так как у вас есть одна запись нитей и чтение одного или нескольких потоков. Чтобы обеспечить безопасность потока, вам необходимо убедиться, что записи не мешают чтению. – biziclop