大家好我有一个小问题。我正在为Android编写一个应用程序,我有一部分代码就像这样。
public void loop(){
for(Car car:carList)
car.run();
}
我收到错误 java.util.ConcurrentModificationException 我也尝试使用迭代器来快速解决问题。 此外,我使用 synchronized ,因为我检查了oracle文档中的错误,并且它说可能是由许多使用相同代码的线程引起的。
public synchronized void loop(){
Iterator<Car> carIterator = carList.iterator();
while(cardIterator.hasNext()){
carIterator.next().run();
}
}
我真的不知道为什么我找到的任何解决方案都不起作用。我在后台服务中使用了大部分情况下的这部分代码,并且我也使用了包含该方法的类(使用单例)。 在此先感谢所有的社区
感谢支持人员, -carList是Car对象的ArrayList。 我的车类是这样的
public class Car{
private int mSpeed;
private int mDistance; //zero at first
........
public void run(){
mSpeed=getRandomSpeed();
mDistance+=mSpeed;
updateDistanceInDB();//here I sabe the distance in DB using a DB helper
}
.........
}
- 错误表示它是在执行方法运行的行中生成的 有一些奇怪的东西,因为该应用程序在我拥有的另一台设备上运行良好。
答案 0 :(得分:2)
解决此异常的最强力方法是使用CopyOnWriteArrayList
代替您当前的List
。这将确保在迭代期间不会看到for-each循环期间对列表的任何更新,因此不会抛出ConcurrentModificationException
。
根据其文件:
“snapshot”样式迭代器方法在创建迭代器时使用对数组状态的引用。这个数组在迭代器的生命周期内永远不会改变,所以干扰是不可能的,并且保证迭代器不会抛出
ConcurrentModificationException
。
但是,根据具体情况,可能有更好的方法来解决您的问题。查看代码的哪些部分对List
进行修改,并确保它们在迭代期间不运行。