【发布时间】:2012-07-19 03:36:41
【问题描述】:
有没有办法阻止 ListIterator 抛出 ConcurrentModificationException?这就是我想做的:
- 用一堆对象创建一个 LinkedList,这些对象有一个要经常执行的特定方法。
- 拥有一定数量的线程(比如N个),所有这些线程都负责执行LinkedList中对象的上述方法。例如,如果列表中有 k 个对象,线程 n 将执行列表中第 n 个对象的方法,然后继续执行第 n+N 个对象,然后执行第 n+2N 个等,直到它循环回到开头。
这里的问题在于这些对象的检索。我显然会使用 ListIterator 来完成这项工作。但是,我预测这不会走得太远,这要归功于根据文档将抛出的 ConcurrentModificationException。我希望列表是可修改的,并且迭代器不在乎。事实上,预计这些对象会创建和销毁列表中的其他对象。 我想到了一些解决方法:
- 创建和销毁一个新的迭代器以检索给定索引处的对象。但是,这是 O(n),不可取。
- 请改用 ArrayedList;然而,这也是不可取的,因为删除是 O(n) 并且列表需要不时扩展(也许是收缩?)存在问题。
- 编写我自己的 LinkedList 类。不想。
因此,我的问题。有没有办法阻止 ListIterator 抛出 ConcurrentModificationException?
【问题讨论】:
-
为什么不考虑使用 BlockingQueue - docs.oracle.com/javase/6/docs/api/java/util/concurrent/…
-
为什么一定要使用迭代器?
-
我不确定 BlockingQueue 将如何解决我的问题...能够检索列表中的任意索引至关重要,因此队列不会这样做...
-
我“必须”使用迭代器,因为这是我所知道的唯一可以用来遍历原生 Java LinkedList 的方法。如果有其他方法可以做到这一点,请分享。
-
@user1536654 您多久修改一次列表(添加、设置、删除...)?
标签: java multithreading linked-list concurrentmodification