Java在不同的地方同时修改列表

Ad *_*dum 3 java iterator concurrentmodification copyonwritearraylist

我有这段代码,我使用迭代器遍历ArrayList,如:

Iterator iterator = list.iterator();
while (iterator.hasNext()) {
  Element element = iterator.next();
  iterator.remove();
  handle(element)
}
Run Code Online (Sandbox Code Playgroud)

其中'handle(元素元素)`如下:

ListIterator iterator = list.listiterator();
iterator.add(element);
Run Code Online (Sandbox Code Playgroud)

现在这给出了ConcurrentModificationException,因为iterator第一个方法中没有使用新添加的元素更新.

我目前使用CopyOnWriteArrayList解决了这个问题,但这些对性能来说非常昂贵.有没有更好的方法来解决这个问题?

提前致谢!

(注意:这个例子没有任何意义,但是用来说明我面对的是什么)


我会试着解释为什么我这样做:

  • 我在主类中有一个需要执行的'命令'列表

  • 我有一个while循环(示例中的代码1)迭代这些命令并逐个执行它们,同时从列表中执行时删除它们.

  • 执行命令时,此命令可以依次向我的主类中保存的列表添加新命令.(这实际上有点复杂:处理命令要求客户端响应,而客户端的响应将响应命令,并且会将其添加到保存的列表中).

Ste*_*n C 5

鉴于所述的要求,简单的解决方案是使用Queue(javadoc)而不是a List.

我在主类中有一个需要执行的'命令'列表

A Queue可以表示一系列命令.

我有一个while循环(示例中的代码1)迭代这些命令并逐个执行它们,同时从列表中执行时删除它们.

a的等价物Queue是重复调用remove()poll()类似来获取和删除第一个命令Queue.你反复这样做,直到它Queue是空的.

请注意,这不涉及Iterator.

执行命令时,此命令可以依次向我的主类中保存的列表添加新命令.

这可以通过调用add()offer()添加命令来完成Queue.


请注意,有许多不同的实现Queue具有不同的属性:

  • 有限或无限大小的队列
  • 阻止或不阻止的队列
  • 简单的FIFO队列与LIFO队列或优先级队列