我有一个私有类变量,它被声明为
private List<String> list= new ArrayList<String>();
当多个线程尝试遍历列表时,我的应用程序抛出java.util.ConcurrentModificationException
for (Iterator i = list.iterator(); i.hasNext(); ){
System.out.println(i.next()+"\n");
}
我正在寻找建议,以最小的改变来避免这个问题。此类变量由此类中的多个方法共享和使用。
答案 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>());