4

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

可悲的是, AtomicLongArray 中的实际 long[] 是私有的,似乎没有吸气剂。有没有办法做到这一点,这意味着将值从一个 AtomicLongArray 复制到另一个?我无法基于此类创建自己的类,因为 sun.misc.Unsafe 类对我不可用。

这是必需的,因为我将迭代这些值,并且我不希望它们在迭代期间被另一个线程修改。所以我想我可以制作一个副本并将其用于迭代......

谢谢!菲利普

4

2 回答 2

5

我怀疑你必须先创建自己的long[]并填充它,或者只是迭代原来的:

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

请注意,虽然每个单独的操作AtomicLongArray都是原子的,但没有批量操作 - 所以没有办法在时间 T 获取整个数组的“快照”。如果你想要那种行为,我相信你需要使用同步。

于 2012-02-23T06:21:01.807 回答
2

此数据结构允许同时更新集合中的各个条目。没有整体锁定,因此您无法阻止另一个线程在迭代时更改内容。

如果你需要这个,你需要一个解决方法,例如复制数组并再次循环以检查它没有改变。如果改变,重复。或者你需要一个支持全局锁的集合。

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;
}

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

于 2012-02-23T08:20:06.043 回答