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

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

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

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


person user21479    schedule 20.05.2018    source источник
comment
Если список статичен, то вы правы. Предпочтительнее, чтобы каждый поток работал над разделом списка. Однако, поскольку вы не говорите, какой список вы используете (можно ли его модифицировать?), нам нужна дополнительная информация.   -  person edharned    schedule 21.05.2018
comment
да, список не меняется после запуска forkjoin.   -  person user21479    schedule 21.05.2018


Ответы (2)


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

Element[] matching = 
    Stream.of(largeArray)
          .parallel()
          .filter(e -> e.theField.equals(theTargetValue))
          .toArray();
person Brian Goetz    schedule 20.05.2018
comment
спасибо, Брайан, я прочитал ваш Java Concurrency in Practice и я ваш поклонник. хотелось бы увидеть новое издание с такой рекомендацией! - person user21479; 21.05.2018
comment
@ user21479 Я тоже! - person Brian Goetz; 21.05.2018

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

person Robin Green    schedule 20.05.2018