是否有一个容器实现List接口,在迭代时支持并发修改?具体来说,我希望一个线程迭代集合,而许多线程插入和从列表中删除元素。迭代器应该看到它尚未遍历的列表的修改。有迭代时支持并发修改的列表集合吗?
我在寻找类似的ConcurrentLinkedQueue但添加和删除特定索引元素的支持迭代行为。最好我在寻找强大的一致性(并且愿意为它争取锁定争用开销),但我可能生活在一致性较弱的环境中。
我很高兴地看着第三方库,因为我看不到它提供什么,我寻找的标准库的东西。
是否有一个容器实现List接口,在迭代时支持并发修改?具体来说,我希望一个线程迭代集合,而许多线程插入和从列表中删除元素。迭代器应该看到它尚未遍历的列表的修改。有迭代时支持并发修改的列表集合吗?
我在寻找类似的ConcurrentLinkedQueue但添加和删除特定索引元素的支持迭代行为。最好我在寻找强大的一致性(并且愿意为它争取锁定争用开销),但我可能生活在一致性较弱的环境中。
我很高兴地看着第三方库,因为我看不到它提供什么,我寻找的标准库的东西。
有一些接近。它被称为CopyOnWriteArrayList
- 虽然限制是迭代器在迭代过程中不会看到所做的更改,但它会继续迭代迭代开始时的迭代。
该集合是在写入速度慢(但快上读取),这是另一个要考虑的。
jME3有一个名为SafeArrayList
doc here的内部集合,速度更快但不支持多线程访问。它确实支持从迭代器等访问tho(所以你可以循环遍历列表中的对象,并且可以同时添加/删除它们,只要不尝试从多个线程执行)。迭代器在迭代时不会看到所做的更改,它们将继续遍历原始数据。
并发包提供了许多其他数据结构,其可以帮助为好。
另一种方法是只使用一个标准ArrayList
,synchronize
名单进行修改并阅读,然后使用指数迭代它。 (即list.get(i)
)。
虽然会有很多边缘案例。例如,如果你删除一个元素,它会将所有其他元素全部洗掉,这样你就可以跳过那个点上的迭代器。
事实上你可能最终需要不断迭代器的列表,并通过你的迭代器的列表,当你添加/删除元素循环,并相应地更新自己的位置!
单独使用Java API,你可以使用Collections.synchronizedList()
获得同步列表。检查该方法的规格是否适合您的使用。然后使用ListIterator
(使用List.listIterator()
方法获得)来迭代和修改列表。
这不起作用,它会在迭代时锁定修改列表。 –
但锁定集合写入应该仍然很好,不是吗? – Neel
他想要一个迭代器,它可以在迭代过程中看到所做的更改。如果收藏被锁定,他们无法进行更改... –
道歉,我不知道这是脱离主题。我不是打算征求意见,而是发现是否存在符合我需要的事情。 –