简化的情况是,我有一个LongAdders数组,并且多个线程正在访问此数组,以便在给定索引处递增变量。

在没有任何其他锁定机制的情况下进行arraycopy安全吗?

就我对此事的调查而言,应该没问题,因为LongAdder的所有重要字段都是易变的,并且由于描述的缘故,invoke()应该是原子的(也就是说,我希望它不会保留可能属于任何状态的任何部分状态)问题)。

有人可以确认吗?

附言我知道我可能没有得到最新的快照(在复制过程中增加),但是可以。

最佳答案

LongAdder数组将仅包含引用,因此将被复制。 LongAdder中的字段与此无关。

使用arraycopy是否“安全”取决于您在处理它-如果您正在使用它将一个数组复制到另一个数组,那么就好了(就其本身;您需要担心数组如何工作)使线程可见)。如果使用它将数组的一部分复制到同一数组的另一部分,则应考虑多个线程从同一索引读取并获得不同引用的可能性。

10-07 12:39