Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否存在支持迭代时并发修改的列表集合?_Java_List_Collections_Concurrency_Iteration - Fatal编程技术网

Java 是否存在支持迭代时并发修改的列表集合?

Java 是否存在支持迭代时并发修改的列表集合?,java,list,collections,concurrency,iteration,Java,List,Collections,Concurrency,Iteration,是否有一个容器实现了列表接口,它支持迭代时的并发修改?具体地说,我希望一个线程在集合上迭代,而多个线程在此列表中插入和删除元素。迭代器应该看到它尚未遍历的列表的修改 我正在寻找类似于ConcurrentLinkedQueue的迭代行为,但支持在特定索引处添加和删除元素。我最好是寻找强一致性(并愿意为此支付锁争用开销),但我可能会接受弱一致性 我很高兴看到第三方库,因为我在标准库中看不到任何提供我所需内容的内容。有一些相似之处。它被称为CopyOnWriteArrayList——尽管存在限制,迭代

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

我正在寻找类似于ConcurrentLinkedQueue的迭代行为,但支持在特定索引处添加和删除元素。我最好是寻找强一致性(并愿意为此支付锁争用开销),但我可能会接受弱一致性


我很高兴看到第三方库,因为我在标准库中看不到任何提供我所需内容的内容。

有一些相似之处。它被称为
CopyOnWriteArrayList
——尽管存在限制,迭代器在迭代时不会看到所做的更改,但它将继续迭代集合,就像迭代开始时一样

集合中写得慢(但读起来快),这是另一件需要考虑的事情。

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

并发包提供了许多其他数据结构,这些数据结构也可能有所帮助

另一种方法是只使用列表上的标准
ArrayList
synchronize
进行修改和读取,然后使用索引对其进行迭代。(即
列表。获取(i)

不过会有很多边缘案例。例如,如果您删除一个元素,它将向下移动所有其他元素,因此您将跳过超过该点的任何迭代器上的一个元素


事实上,您可能最终需要保留一个迭代器列表,当您添加/删除元素时,循环遍历迭代器列表并相应地更新它们的位置

仅使用Java API,就可以使用
Collections.synchronizedList()
获取同步列表。检查方法的规格是否适合您的使用。并且,使用
ListIterator
(使用
List.ListIterator()
方法获得)来迭代和修改列表。

这不起作用,它会在迭代时锁定列表进行修改。但是锁定集合进行写操作应该仍然可以,不是吗?他想要一个迭代器,可以在迭代时看到所做的更改。如果收藏被锁定,他们将无法进行更改…抱歉,我不知道这与主题无关。我不是想征求意见,而是想知道是否有适合我需要的东西存在。