Java 在不同地方同时修改列表
Java modifying list concurrently at different places
我有一段代码,我在其中使用迭代器遍历 ArrayList,例如:
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Element element = iterator.next();
iterator.remove();
handle(element)
}
'handle(Element element)' 的位置如下:
ListIterator iterator = list.listiterator();
iterator.add(element);
现在这给出了一个 ConcurrentModificationException,因为第一个方法中的 iterator
没有用新添加的元素更新。
我目前已经使用 CopyOnWriteArrayList 解决了这个问题,但是这些对于性能来说非常昂贵。有没有更好的方法来解决这个问题?
提前致谢!
(注意:该示例没有任何意义,但旨在说明我所面临的问题)
我将尝试解释我为什么这样做:
我的主 class 中有一个 'commands' 列表需要执行
我有一个 while 循环(示例中的代码 1)迭代这些命令并逐条执行它们,同时在从列表中执行时删除它们。
在执行命令时,该命令可以依次将新命令添加到保存在我的 main class 中的列表中。 (这实际上有点复杂:处理一个命令需要客户端的响应,而客户端又会响应一个命令,并且该命令将被添加到保存的列表中)。
鉴于上述要求,简单的解决方案是使用 Queue
(javadoc) 而不是 List
.
I have a list of 'commands' in my main class that need to be executed
一个Queue
可以表示一个命令序列。
I have a while-loop (code 1 in the example) that iterates over these commands and execute them one-by-one, while removing them when executed from the list.
Queue
的等价物是重复调用 remove()
或 poll()
等以从 Queue
中获取和删除第一个命令。您重复执行此操作,直到 Queue
为空。
请注意,这不涉及 Iterator
。
While executing a command, this command can in its turn add a new command to the list that is saved in my main class.
这可以通过调用 add()
或 offer()
向 Queue
添加命令来完成。
请注意,Queue
有许多不同的实现,具有不同的属性:
- 具有有限或无限大小的队列
- 阻塞或不阻塞的队列
- 简单的 FIFO 队列与 LIFO 队列或优先级队列
我有一段代码,我在其中使用迭代器遍历 ArrayList,例如:
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Element element = iterator.next();
iterator.remove();
handle(element)
}
'handle(Element element)' 的位置如下:
ListIterator iterator = list.listiterator();
iterator.add(element);
现在这给出了一个 ConcurrentModificationException,因为第一个方法中的 iterator
没有用新添加的元素更新。
我目前已经使用 CopyOnWriteArrayList 解决了这个问题,但是这些对于性能来说非常昂贵。有没有更好的方法来解决这个问题?
提前致谢!
(注意:该示例没有任何意义,但旨在说明我所面临的问题)
我将尝试解释我为什么这样做:
我的主 class 中有一个 'commands' 列表需要执行
我有一个 while 循环(示例中的代码 1)迭代这些命令并逐条执行它们,同时在从列表中执行时删除它们。
在执行命令时,该命令可以依次将新命令添加到保存在我的 main class 中的列表中。 (这实际上有点复杂:处理一个命令需要客户端的响应,而客户端又会响应一个命令,并且该命令将被添加到保存的列表中)。
鉴于上述要求,简单的解决方案是使用 Queue
(javadoc) 而不是 List
.
I have a list of 'commands' in my main class that need to be executed
一个Queue
可以表示一个命令序列。
I have a while-loop (code 1 in the example) that iterates over these commands and execute them one-by-one, while removing them when executed from the list.
Queue
的等价物是重复调用 remove()
或 poll()
等以从 Queue
中获取和删除第一个命令。您重复执行此操作,直到 Queue
为空。
请注意,这不涉及 Iterator
。
While executing a command, this command can in its turn add a new command to the list that is saved in my main class.
这可以通过调用 add()
或 offer()
向 Queue
添加命令来完成。
请注意,Queue
有许多不同的实现,具有不同的属性:
- 具有有限或无限大小的队列
- 阻塞或不阻塞的队列
- 简单的 FIFO 队列与 LIFO 队列或优先级队列