使用Java 1.6和AtomicLongArray,我想将原始的AtomicLongArray“复制”成一个新的。有一个构造函数接受一个数组(AtomicLongArray(long [])),所以我想我可以从原始数组中获取数组并将其提供给构造函数。
可悲的是,AtomicLongArray中的实际long []是私有的,似乎没有getter。有没有办法做到这一点,意味着将值从一个AtomicLongArray复制到另一个?我无法基于这个类创建自己的类,因为我无法使用sun.misc.Unsafe类。
这是必需的,因为我将迭代这些值,并且我不希望它们在迭代期间被另一个线程修改。所以我认为我可以制作副本并将其用于迭代...
谢谢! 菲利普
答案 0 :(得分:4)
我怀疑你必须创建自己的long[]
并首先填充它,或者只是迭代原始版本:
AtomicLongArray copy = new AtomicLongArray(original.length());
for (int i = 0; i < copy.length(); i++)
{
copy.set(i, original.get(i));
}
请注意,虽然AtomicLongArray
中的每个单独操作都是原子操作,但是没有批量操作 - 因此无法在时间T获取整个数组的“快照”。你想要那种行为,我相信你需要使用同步。
答案 1 :(得分: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;
}
这不是完全安全的,但可能足以满足您的需要。