Java 是否有“arrayAdd”方法或其他方法来促进数组添加?

Java 是否有“arrayAdd”方法或其他方法来促进数组添加?,java,arrays,matrix,addition,Java,Arrays,Matrix,Addition,所以我有一个数组 static final int N = maxNofActiveThreads; static final int[]arr = new int[N*nofEntries]; 其中N线程写入数组的互斥区域 我现在想添加一个监视线程,它将通过简单地汇总所有线程的表来定期收集结果以供决策 即,在伪代码中 int[] snapshot = arr[0 : nofEntries] + arr[nofEntries : 2*nofEntries] + ... + arr[(N-1)

所以我有一个数组

static final int N = maxNofActiveThreads;
static final int[]arr = new int[N*nofEntries];
其中
N
线程写入数组的互斥区域

我现在想添加一个监视线程,它将通过简单地汇总所有线程的表来定期收集结果以供决策

即,在伪代码中

int[] snapshot = arr[0 : nofEntries] + arr[nofEntries : 2*nofEntries] + ... + arr[(N-1) * nofEntries : N*nofEntries]
显而易见的选择是简单地创建

int[] snapshot = new int[nofEntries]
System.arrayCopy(arr,0,snapshot,0,nofEntries);
然后遍历arr的其余部分,一次添加一个值

有没有更聪明/更有效的方法

哦,我们不在乎我们是否经常错过更新,它最终会在下一次传递时出现,这很好。不需要任何同步


(我还应该提到,我正在从事的项目要求我使用Java 7。)

我能想到的最好的方法是使用
数组
类静态方法
parallelSetAll
。当它尝试并行化操作时,它可能会更高效。另一种并行方法的Javadoc表示:

。。。对于大型阵列,计算通常比顺序循环更有效

因此,您可以使用:

private int tsum(int index) {
    int val = 0;
    for (int t=0; t<N; t++) {
        val += arr[index + t * nofEntries];
    }
    return val;
}

为什么所有线程共享一个数组?“不需要任何同步”语句也有点令人担忧。@Kayaman好吧,如果结果证明我确实需要遍历数组,我至少有空间局部性。此外,它使修改线程和监视线程都可以轻松访问所有线程的数据,特别是在传递线程ID而不是保持线程不变的情况下非常有用。在剩下的代码中有足够的内存障碍,即使没有额外的同步,更新最终也会可见。你可以自己编写这样的方法。@Sweeper我可以,是的。但我的问题是,是否已经有了一些东西。重新发明轮子没有意义,不是吗?标准JDK中没有。阵列从未如此重要。其他库也存在,但它们是你可以找到的,因为推荐是离题的。谢谢,但这不仅需要Java 8,而且要贵得多。您的访问模式到处都是,并且您能够并行计算条目并不能获得足够的性能来证明丢失空间位置是合理的。(我不知道你为什么认为“另一个并行方法”的Javadocs是相关的。)我实际上尝试过:(naive:),(parallel:)parallel要么耗尽了时间,要么耗尽了内存。@User1291:parralel操作的效率可能在很大程度上取决于系统,尤其是硬件……我不否认这一点。但我非常怀疑,在这样一个内存受限的问题中,通过引入更多的随机访问,可以提高性能。
    IntUnaryOperator generator = (x) -> tsum(x) ;
    int[] snapshot = new int[nofEntries];
    Arrays.parallelSetAll(snapshot, generator);