我有两个线程在修改同一个对象,比如说 MyObject,所以已经同步了这个对象。但在其中一个线程中,另一个对象被修改,因此必须调用 MyObject。
IE
public void run(){
synchronized(MyObject){
...
anotherObject.modify();//<----calls MyObject
...
}
}
这会导致 ConcurrentModificationExceptions。我不知道如何解决这个问题。如果我不同步,我会在两个线程都尝试调用 MyObject 时遇到异常。我怎样才能解决这个问题?
更新:代码适用于 Android 设备。我之前没有提到它,因为这里没有 Android 特定的对象在起作用。LogCat 输出不是很有帮助
02-03 02:47:43.660: ERROR/AndroidRuntime(5258): Uncaught handler: thread main exiting due to unaught exception 02-03 02:47:43.670: ERROR/AndroidRuntime(5258): java.util.ConcurrentModificationException 02-03 02:47:43.670: ERROR/AndroidRuntime(5258): at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:64) 02-03 02:47:43.670: ERROR/AndroidRuntime(5258): at com.jjg .myapp.gameunit.findEnemy(MoveableUnit.java:656)//<---在这个方法中,Gamestate 的集合被迭代到 02-03 02:47:43.670: ERROR/AndroidRuntime(5258): at com.jjg.myapp。 gameunit.update(GameUnit.java:416)
我试图同步的对象本质上是一个名为 gs 的 GameState。它包含各种 ArrayList、数组和其他对象。gs 不是静态的。
上面出现问题的方法是:
for(GameUnit gu : this.getBase().getGameState().getAllUnits()){//<---this is the problem line.
//do some stuff...
}
getAllUnits 返回一个 GameUnits 的 ArrayList(包括调用该方法的 GameUnit - 我不需要迭代器,因为没有对象被删除或创建)。