CONCURRENT
характеристика определяется как:
Характеристическое значение, означающее, что источник элемента может быть безопасно одновременно изменен (допускается добавление, замена и / или удаление) несколькими потоками без внешней синхронизации.
, тогда как документация ArrayList
гласит:
Обратите внимание, что эта реализация не синхронизирована. Если несколько потоков одновременно обращаются к экземпляру ArrayList
, и хотя бы один из потоков структурно изменяет список, он должен быть синхронизирован внешне. (Структурная модификация - это любая операция, которая добавляет или удаляет один или несколько элементов,…
Нельзя сказать более ясно, что ArrayList
в качестве источника потока - это все, кроме CONCURRENT
.
Документация, которую вы цитировали, не противоречит этому. Но я должен признать, что было бы намного лучше, если бы был разрыв абзаца перед «Для потоковых источников с хорошим поведением,…», чтобы дать читателю перерыв и отразить то, что было сказано до того, как это произойдет потом. другая точка, которая применяется к ArrayList
, а также ко всем другим «источникам потоков с хорошим поведением», но больше не имеет отношения к характеристике CONCURRENT
и не влияет на ограничения поведенческих параметров, описанные перед ней.
Все, что говорит новый пункт, заключается в том, что вы можете изменить ArrayList
до работы терминала в терминале Stream, но все же только из одного потока (или с вашей собственной синхронизацией), но вы по-прежнему не разрешается выполнять структурные изменения во время текущей операции терминала, что исключает любые структурные изменения из поведенческих параметров, поскольку они всегда оцениваются во время текущей операции терминала.
Случай CopyOnWriteArrayList
отличается, у него не будет характеристики CONCURRENT
, потому что вместо этого его сплитераторы будут иметь характеристику IMMUTABLE
, так как вы будете перебирать неизменный снимок; Модификации оригинального CopyOnWriteArrayList
не повлияют на Stream.