迭代List时出现ConcurrentModificationException

时间:2015-08-21 02:56:54

标签: java multithreading concurrency

我有一个私有类变量,它被声明为

private List<String> list= new ArrayList<String>();

当多个线程尝试遍历列表时,我的应用程序抛出java.util.ConcurrentModificationException

for (Iterator i = list.iterator();  i.hasNext(); ){
    System.out.println(i.next()+"\n");
}

我正在寻找建议,以最小的改变来避免这个问题。此类变量由此类中的多个方法共享和使用。

3 个答案:

答案 0 :(得分:1)

iterator上使用Collection时,您必须使用iterator.remove()而非Collection.remove()来阻止ConcurrentModificationException。但是,如果您有多个线程,则可能还需要使用Collections.syncrhonizedList()

来自Oracle Java Docs:

List list = Collections.synchronizedList(new ArrayList());
  ...
synchronized (list) {
    Iterator i = list.iterator(); // Must be in synchronized block
    while (i.hasNext())
        foo(i.next());
}

答案 1 :(得分:1)

你可以试试CopyOnWriteList,JavaDocs说:

  

此数组在迭代器的生命周期内永远不会更改,因此无法进行干扰,并且保证迭代器不会抛出ConcurrentModificationException。

 List<String> list = new CopyOnWriteArrayList<>();

答案 2 :(得分:0)

由于你已经有了一个线索,这个列表将由多个线程访问,声明一个线程安全的List

List<String> list= Collections.synchronizedList(new ArrayList<String>());