2013-12-22 41 views
5

是否有一个容器实现List接口,在迭代时支持并发修改?具体来说,我希望一个线程迭代集合,而许多线程插入和从列表中删除元素。迭代器应该看到它尚未遍历的列表的修改。有迭代时支持并发修改的列表集合吗?

我在寻找类似的ConcurrentLinkedQueue但添加和删除特定索引元素的支持迭代行为。最好我在寻找强大的一致性(并且愿意为它争取锁定争用开销),但我可能生活在一致性较弱的环境中。

我很高兴地看着第三方库,因为我看不到它提供什么,我寻找的标准库的东西。

+0

道歉,我不知道这是脱离主题。我不是打算征求意见,而是发现是否存在符合我需要的事情。 –

回答

5

有一些接近。它被称为CopyOnWriteArrayList - 虽然限制是迭代器在迭代过程中不会看到所做的更改,但它会继续迭代迭代开始时的迭代。

该集合是在写入速度慢(但快上读取),这是另一个要考虑的。

jME3有一个名为SafeArrayListdoc here的内部集合,速度更快但不支持多线程访问。它确实支持从迭代器等访问tho(所以你可以循环遍历列表中的对象,并且可以同时添加/删除它们,只要不尝试从多个线程执行)。迭代器在迭代时不会看到所做的更改,它们将继续遍历原始数据。

并发包提供了许多其他数据结构,其可以帮助为好。

另一种方法是只使用一个标准ArrayListsynchronize名单进行修改并阅读,然后使用指数迭代它。 (即list.get(i))。

虽然会有很多边缘案例。例如,如果你删除一个元素,它会将所有其他元素全部洗掉,这样你就可以跳过那个点上的迭代器。

事实上你可能最终需要不断迭代器的列表,并通过你的迭代器的列表,当你添加/删除元素循环,并相应地更新自己的位置!

0

单独使用Java API,你可以使用Collections.synchronizedList()获得同步列表。检查该方法的规格是否适合您的使用。然后使用ListIterator(使用List.listIterator()方法获得)来迭代和修改列表。

+0

这不起作用,它会在迭代时锁定修改列表。 –

+0

但锁定集合写入应该仍然很好,不是吗? – Neel

+0

他想要一个迭代器,它可以在迭代过程中看到所做的更改。如果收藏被锁定,他们无法进行更改... –