在创建迭代器后修改arraylist

时间:2014-08-31 07:02:25

标签: java arraylist

我有一个在两个线程之间共享的List。在一个线程中,我从列表对象创建了一个迭代器,在另一个线程中我正在修改列表。我该怎么办才能避免ConcurrentModificationException

2 个答案:

答案 0 :(得分:0)

最简单的方法是使用for循环。像这样即使数据结构发生了变化也不成问题:

List<Integer> list = new ArrayList<Integer>();

for(int i = 0; i < list.size(); i++)
{
  Integer n = list.get(i);
  // Anything inserted after the index i will be discovered in next iteration
}

为避免性能问题,请确保您的ListArrayList,其具有恒定的时间访问权限,而LinkedList具有线性时间访问权限。还记得在从多个线程访问列表时使用Collections.synchronizedList

实施例

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

for(int i = 0; i < list.size(); i++)
{
    Integer n = list.get(i);
    System.out.println(n);
    if (n == 1) list.add(100);
}

输出

1
2
3
100

您可以对其进行测试here

答案 1 :(得分:0)

ArrayList迭代器与所有不是来自java.util.concurrent包的java集合一样,在使用迭代器遍历集合时检测到结构更改时抛出concurrentModificationException。

如果需要在多个线程之间共享列表对象,请确保使用适当的外部同步或使用类似CopyOnWriteArrayList的线程安全类。

相关问题