使用Java1.6和AtomicLongArray,我想把原来的AtomicLongArray“复制”到一个新的Java中。有一个构造函数接受一个数组(AtomicLongArray(long[])),所以我想我可以从原始的数组中获取数组,并将其提供给构造函数。
遗憾的是,AtomicLongArray中的实际long[]是私有的,似乎没有用于它的getter。有没有办法做到这一点,也就是把值从一个AtomicLongArray复制到另一个呢?我不能基于这个类创建我自己的类,因为我不能使用sun.misc.Unsafe类。
这是必需的,因为我将遍历这些值,并且我不希望在迭代期间被另一个线程修改。所以我想我可以复制一份,并将其用于迭代...
谢谢!菲利普
发布于 2012-02-23 14:21:02
我怀疑您必须创建自己的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-23 16:20:06
此数据结构允许对集合中的单个条目进行并发更新。没有整体锁,所以你不能阻止另一个线程在你迭代的时候改变它的内容。
如果你需要这样做,你需要一个变通的方法,例如复制数组并再次循环以检查它没有改变。如果更改,请重复。或者你需要一个支持全局锁的集合。
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;
}这并不是完全安全的,但可能足以满足您的需求。
https://stackoverflow.com/questions/9408112
复制相似问题