我有一个在两个线程之间共享的List。在一个线程中,我从列表对象创建了一个迭代器,在另一个线程中我正在修改列表。我该怎么办才能避免ConcurrentModificationException
。
答案 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
}
为避免性能问题,请确保您的List
是ArrayList
,其具有恒定的时间访问权限,而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的线程安全类。