fork/join,输入数组需要同步吗?

fork/join, synchronization necessary on input array?

我有大量对象,想收集具有特定字段值的所有对象,因为它太大了,我计划在 java.[=11 中使用 fork/join =]

大数组不是通过创建新的子列表而是通过传入原始列表但具有 start/end 范围来分叉的。 compute 查找满足特定谓词的所有对象并将它们添加到传入的 ConcurrentLinkedQueue 中。 加入所有子任务后,将ConcurrentLinkedQueue写入存储。

输入大列表是否必须同步列表?我相信不是因为线程启动先于规则,我认为它在 fork/join 执行开始时的状态对任何 tasks/threads 都是可见的。但我想确认一下我的理解是否正确。

是的,由于您所说的原因,这是线程安全的。

happens-before 边与各种 fork-join 操作相关联,因此您通常可以利用这些边而不需要额外的同步。但是,您可能会发现以下内容(在后台使用 FJ)以更少的工作量为您提供所需的答案:

Element[] matching = 
    Stream.of(largeArray)
          .parallel()
          .filter(e -> e.theField.equals(theTargetValue))
          .toArray();