【发布时间】:2017-10-07 04:45:25
【问题描述】:
我有以下代码引发 ConcurrentModificationException,因为我在同一个列表上使用了两个不同的迭代器,其中一个正在修改列表。所以,第二个迭代器在读取列表时会抛出异常,因为其他迭代器已经修改了列表。
List<Integer> list = new ArrayList<>();
populate(list);//A method that adds integers to list
ListIterator<Integer> iterator1 = list.listIterator();
ListIterator<Integer> iterator2 = list.listIterator();
while (iterator1.hasNext()) {
if(iterator1.next() < 5)
iterator1.remove();
}
while (iterator2.hasNext()){
if(iterator2.next() < 5) {
//Call handler
}
}
我的问题是iterator2 如何在内部知道list 已被其他迭代器修改,如果它尚未到达iterator1 尚未删除的元素?它是如何发现其他一些iterator 已经改变了list?一种方法是跟踪大小,但这不是原因,因为其他迭代器可以替换任何元素。
【问题讨论】:
-
你为什么在乎?您在修改列表之前创建了迭代器。可能有一个“脏”标志,但同样,您为什么要编写这样的代码来工作?
-
我不希望这样的代码工作。但我确实很想知道这种情况是如何检测到的。
-
使用免费提供的源代码!
-
不知道这样的问题会受到处罚!会记住这一点。
标签: java exception collections concurrentmodification listiterator