2015-05-18 3 views
3

Скажем, у меня есть List объектов, которые изменяются только одним потоком (поток может добавлять или удалять объекты), а другой поток иногда использует поток api из приведенного выше коллектора для выполнения некоторых операций с потоком он и в конце (нетерпеливая операция) возвращает новую коллекцию. Является ли этот сценарий безопасным потоком? ведь только один поток обновляет коллекцию.Java 8 поток из модифицированной коллекции

+0

Я так не думаю ... что произойдет, если один поток удалит элемент, а другой попытается его прочитать? Возможно, я ошибаюсь, потому что я не уверен, как потоки работают под капотом. – npinti

+1

Это не потокобезопасный сценарий, так как у вас есть одна запись нитей и чтение одного или нескольких потоков. Чтобы обеспечить безопасность потока, вам необходимо убедиться, что записи не мешают чтению. – biziclop

ответ

6

Это полностью зависит от вашего источника List осуществления. С ArrayList вы может получить ConcurrentModificationException (или может получить поврежденные данные или какое-либо другое исключение: см. Комментарий). С помощью CopyOnWriteArrayList вы можете безопасно использовать потоковые операции: они будут видеть состояние списка, которое было актуальным при создании потока. В любом случае вы должны проверить документацию по методу spliterator() соответствующей коллекции, чтобы убедиться, что ее можно использовать в параллельной среде.

+6

Вы * можете * получить 'ConcurrentModificationException', так как он будет основан на принципе« наилучшего усилия ». Вы * можете * молча получить поврежденные данные. Или другое исключение, которое не говорит вам, что оно было вызвано одновременной манипуляцией, например. «IndexOutOfBoundsException». Вы * можете * уйти со сломанным кодом в течение долгого времени, прежде чем внезапно возникнут побочные проблемы ... – Holger

+1

@ Хольджер, хорошая точка. Отредактировал ответ. –

0

Вы должны получить исключение параллельной модификации, поскольку вы одновременно читаете и записываете эту коллекцию.

+1

Что делать, если коллекция допускает одновременные изменения? –

Смежные вопросы