fork / join, синхронизация необходима на входном массиве? - PullRequest
0 голосов
/ 20 мая 2018

У меня большой массив объектов, и я хочу собрать все объекты с определенным значением поля, и, поскольку это такой большой массив, я планирую использовать fork / join в java.

большой массив разветвляетсяне путем создания новых подсписков, а путем передачи исходного списка, но с начальным / конечным диапазоном.compute находит все объекты, которые соответствуют определенному предикату, и добавляет их к переданному в ConcurrentLinkedQueue.После объединения всех подзадач напишите ConcurrentLinkedQueue в хранилище.

Должен ли входящий большой список быть синхронизированным списком?Я полагаю, что не из-за правила «начало потока происходит раньше», я думаю, что его состояние в начале выполнения fork / join было бы видимым для любых задач / потоков.Но я хотел подтвердить, что мое понимание верно.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Имеются случайные до ребра, связанные с различными действиями fork-join, так что вы обычно можете использовать их без дополнительной синхронизации.Тем не менее, вы можете обнаружить, что следующее (которое использует FJ под капотом) дает вам ответ, который вы хотите с гораздо меньшим количеством работы:

Element[] matching = 
    Stream.of(largeArray)
          .parallel()
          .filter(e -> e.theField.equals(theTargetValue))
          .toArray();
0 голосов
/ 21 мая 2018

Да, это потокобезопасно по указанной вами причине.

...