繁体   English   中英

当您必须并行处理时,在 java 中同步 ArrayList 的有效方法

[英]Efficient way of synchronize ArrayList in java when you have to process it parellel

我有列表的集合,我必须迭代每个列表元素并将其放入另一个列表中。数据非常庞大,因此我需要并行处理它,以便获得良好的处理时间。我还需要保留订单列表。当我使用它时,我已经从列表中丢失了元素,或者有时得到 NULL。我们将如何有效地使列表同步或线程安全。

 java.util.List<T> metadata = new ArrayList<T>();
sourceValuesIterable.parallelStream().forEach(tblRow ->
{
    metadata.add();
});

还有一个问题:当您使用 Guava 的谓词从集合中删除 NULL 时,它会改变列表元素的顺序吗?

提前致谢。

如果您想保留任何订单的机会,并行性需要一个“流管道”。 幸运的是,您可以在此处执行此操作:map 将您的 sVI 转换为 Ts,然后通过收集将 stream 变成一个列表:

List<T> metadata = sVI.parallelStream()
    .map(tblRow -> new ThingieThatGoesInMetadata())
    .collect(Collectors.toList());

从那里开始; 这样, 订购得到保证

我认为假设并行化此任务并一次将一个元素添加到新列表中会自动成为复制它的最快方法是错误的。

对于初学者来说,您没有预先调整新的 ArrayList 的大小,因此在您添加元素以达到必要的容量时,它将不断调整大小。

还有与启动并行 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 和合并结果相关的开销。

ArrayList 已经有一个复制构造函数,可以进行有效的复制。 最终,这只是复制底层的引用数组。 很难想象能够在性能上击败那种低级操作。

与性能相关的问题一样,您最好的选择是对其进行分析、衡量结果并使用数据来为您的决策提供信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM