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

时间:2016-04-10 00:31:01

标签: java iterator concurrentmodification copyonwritearraylist

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

Iterator iterator = list.iterator();
while (iterator.hasNext()) {
  Element element = iterator.next();
  iterator.remove();
  handle(element)
}

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

ListIterator iterator = list.listiterator();
iterator.add(element);

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

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

提前致谢!

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

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

  • 我的主要课程中有一个需要执行的“命令”列表

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

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

1 个答案:

答案 0 :(得分:5)

根据规定的要求,简单的解决方案是使用PwCheck()javadoc)而不是Queue

  

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

List可以代表一系列命令。

  

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

Queue的等效内容是重复调用Queueremove()等来获取和删除poll()中的第一个命令。重复执行此操作,直到Queue为空。

请注意,这不涉及Queue

  

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

可以通过调用Iteratoradd()offer()添加命令来完成。

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

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