我有一堆从基类启动的 Runnable 对象。这些对象随机迭代并删除共享 ArrayList 中的项目。我已经同步了这两种方法,但得到了一个ConcurrentModicationException
. 我相信这是因为它们是同步的,但彼此不同步。是这样吗?如果是这样,我应该获得哪个类的锁定?
环境类:
class Environment{
ArrayList<Critter> critter_array = new ArrayList<Critter>();
ArrayList<Food> food_array = new ArrayList<Food>();
Environment(){
Executor ex = Executors.newCachedThreadPool();
Critter A = new Critter();
Critter B = new Critter();
critter_array.add(A);
critter_array.add(B);
ex.execute(A);
ex.execute(B);
}
public synchronized void destroyFood(Food item){
Iterator<Food> iter = food_array.iterator();
while(iter.hasNext()){
Food temp = iter.next();
food_array.remove(temp);
break;
}
}
}
小动物类:
class Critter implements Runnable{
Environment envi;
Critter(Environment E){
envi = E;
}
@Override
public void run() {
//do other stuff
CritterUtilities.iteratorMethod(this, envi);
}
}
CritterUtilities 类:
class CritterUtilities{
public static synchronized iteratorMethod(Critter self, Environment envi){
Iterator<OtherObject> iter = envi.getFood().listIterator();
while(iter.hasNext()){
Food temp = iter.next(); /////////Problem is here
//other stuff that's not related to the prob
}
}
}
堆栈跟踪:
Exception in thread "pool-1-thread-2" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at CritterUtil.getViewableFood(CritterUtil.java:28)
at CritterUtil.getNearestFood(CritterUtil.java:41)
at Critter.hunt(Critter.java:163)
at Critter.run(Critter.java:139)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)