Java 从AtomicLongArray获取数组

Java 从AtomicLongArray获取数组,java,java.util.concurrent,Java,Java.util.concurrent,使用Java1.6和AtomicLongArray,我想将原来的AtomicLongArray“复制”到一个新的AtomicLongArray中。有一个构造函数接受一个数组(AtomicLongArray(long[]),所以我想我可以从原始数组中获取数组并将其交给构造函数 遗憾的是,AtomicLongArray中实际的long[]是私有的,似乎没有getter。有没有办法做到这一点,即将值从一个AtomicLongArray复制到另一个AtomicLongArray?我无法基于该类创建自己的

使用Java1.6和AtomicLongArray,我想将原来的AtomicLongArray“复制”到一个新的AtomicLongArray中。有一个构造函数接受一个数组(AtomicLongArray(long[]),所以我想我可以从原始数组中获取数组并将其交给构造函数

遗憾的是,AtomicLongArray中实际的long[]是私有的,似乎没有getter。有没有办法做到这一点,即将值从一个AtomicLongArray复制到另一个AtomicLongArray?我无法基于该类创建自己的类,因为sun.misc.Unsafe类对我不可用

这是必需的,因为我将迭代这些值,并且我不希望在迭代过程中被另一个线程修改它们。所以我想我可以复制一份,然后用它进行迭代

谢谢!
Phillip

我怀疑您必须先创建自己的
long[]
并填充它,或者只是在原始文件上迭代:

AtomicLongArray copy = new AtomicLongArray(original.length());
for (int i = 0; i < copy.length(); i++)
{
    copy.set(i, original.get(i));
}
AtomicLongArray copy=新的AtomicLongArray(original.length());
对于(int i=0;i

请注意,尽管
AtomicLongArray
中的每个单独操作都是原子操作,但没有批量操作-因此无法在时间T获取整个阵列的“快照”。如果您想要这种行为,我相信您需要使用同步。

此数据结构允许对集合中的单个条目进行并发更新。没有全局锁,因此在迭代时无法阻止另一个线程更改内容

如果需要,则需要解决方法,例如复制阵列并再次循环以检查其是否未更改。如果更改,请重复。或者您需要一个支持全局锁的集合

long[] copy = new long[original.length()];
boolean changed = true;
// repeat until we get an unchanged copy.
while(true) {
    for (int i = 0; i < copy.length(); i++) {
        long l = original.get(i);
        changed |= copy[i] != l;
        copy[i] = l;
    }
    if (!changed) break;
    changed = false;
}
long[]copy=new long[original.length()];
布尔值=真;
//重复,直到我们得到一份未更改的副本。
while(true){
对于(int i=0;i

这不是完全安全的,但可能足以满足您的需要。

我试图避免这种情况-正如您所说,迭代AtomicLongArray本身并不是一种原子操作。同步可能是一种选择……似乎有点过头了。@PhillipAtkinson:这取决于您的需求-您需要原子快照吗?如果是这样,那么基本上
AtomicLongArray
并不能提供您所需要的一切。是的,您可能是对的。我往往过于专注于一种做事的方式。看看其他的解决方案是值得的。。。谢谢!:)谢谢你的建议——我会看看使用这种方法的效果。注意:这并不能保证完成如果阵列很大且您从未停止获取更新,则会发生这种情况。