Безопасно ли передавать параллельную коллекцию во время ее внешнего изменения? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть ConcurrentLinkedQueue, к которому обращаются несколько потоков;предметы в нем неизменны.В одном потоке мне нужен снимок данных, который я делаю, вызывая stream.Это безопасно?Мне известно о требовании невмешательства , но, похоже, речь идет об изменении одной из потоковых операций (потоковые конвейеры ", источник которых может не совпадать, никогда не должны изменять данные потока".источник"), не обязательно внешне.Кроме того, ConcurrentLinkedQueue предназначен для одновременного доступа, так что вот что.

1 Ответ

0 голосов
/ 08 июня 2018

Из документации в ссылке, которую вы предоставили

Для большинства источников данных предотвращение помех означает, что источник данных вообще не изменяется во время выполнения потокового конвейера.Заметным исключением из этого являются потоки, источники которых являются параллельными коллекциями, которые специально предназначены для обработки одновременных изменений.Источниками одновременного потока являются источники, Spliterator которых сообщает характеристику CONCURRENT

Из документации SplitIterator (его характеристика CONCURRENT)

static final int CONCURRENT

Характеристиказначение, означающее, что источник элемента может быть безопасно одновременно изменен (допускается добавление, замена и / или удаление) несколькими потоками без внешней синхронизации.Если это так, ожидается, что Spliterator будет иметь документированную политику, касающуюся воздействия изменений во время обхода.

Это реализация из метода потока интерфейса Collection (который не переопределяется в ConcurrentLinkedQueue)

default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
}

Так что, пока ConcurrentLinkedQueue использует CONCURRENT SplitIterator (что он и делает), я предполагаю, что вы можете безопасно выполнять итерацию вашего ConcurrentLinkedQueue с помощью stream ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...