如果有任何框架实现了具有以下行为的集合,我感兴趣。
假设它最初包含:[1,2,3]
同样适用于删除元素。如果我删除3而不是添加,第二个迭代器应该给我[1,2],而第一个迭代器仍然会给我3和结束。
所以,当我得到迭代器时,我想让它给我一个我创建迭代器时的集合(即使我稍后迭代它,我迭代一点然后继续),当我重置迭代器时,它得到垃圾收集它将更新到最新版本,我应该能够在不同的时间创建多个迭代器实例,根据创建迭代器时的数组内容提供不同的版本。
我需要它可以很好地处理多个线程,并且最好有一个有效的实现。
有没有人知道这样一个集合的任何实现,还是我必须自己实现它?
答案 0 :(得分:7)
java.util.concurrent.CopyOnWriteArrayList
将表现得像这样,除了没有Java集合“重置”迭代器 - 但是获取新的迭代器而不是重置会产生你在这里请求的效果。
答案 1 :(得分:6)
您所描述的内容与CopyOnWriteArrayList
的工作方式非常相似:
以下简单示例,输出如下:
迭代器1 - 1
已添加4 迭代器2 - 1
迭代器2 - 2
迭代器2 - 3
迭代器2 - 4
迭代器1 - 2
迭代器1 - 3
public static void main(String[] args) throws InterruptedException {
final List<Integer> list = new CopyOnWriteArrayList<Integer>();
list.addAll(Arrays.asList(1, 2, 3));
new Thread(new Runnable() {
@Override
public void run() {
for (Integer i : list) {
System.out.println("Iterator 1 - " + i);
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
}
}).start();
Thread.sleep(10);
list.add(4);
System.out.println("4 has been added");
for (Integer i : list) {
System.out.println("Iterator 2 - " + i);
}
}
答案 2 :(得分:3)
您可以使用番石榴库中的ImmutableCollections。
返回的ImmutableList经常 - 并不总是,但经常 - 持续开销视图,而不是显式副本。也就是说,它通常比普通的List更聪明 - 例如,它会使用它 高效包含后备集合的方法。
答案 3 :(得分:3)
您可以使用java.util.concurrent.CopyOnWriteArrayList<E>
根据文件:
ArrayList的线程安全变体,其中包含所有可变操作 (添加,设置等)是通过制作新的副本来实现的 底层数组。
价格昂贵但线程安全。
这通常成本太高,但效率可能更高 遍历操作的数量远远超过突变,并且 当你不能或不想同步遍历时,它很有用 需要排除并发线程之间的干扰。 “快照” style iterator方法使用对数组状态的引用 迭代器的创建点。
当迭代发生在某种快照上时,不支持remove
本身的操作(set
,add
和Iterator
)。
答案 4 :(得分:0)
javolution有线程安全的FastMap