【发布时间】:2012-02-25 09:53:27
【问题描述】:
我有两个线程修改同一个对象,假设是 MyObject,因此同步了该对象。但在其中一个线程中,另一个对象被修改,因此必须调用 MyObject。
即
public void run(){
synchronized(MyObject){
...
anotherObject.modify();//<----calls MyObject
...
}
}
这会导致 ConcurrentModificationExceptions。我不知道如何解决这个问题。如果我不同步,我会在两个线程都尝试调用 MyObject 时遇到异常。我该如何解决这个问题?
更新:代码适用于 Android 设备。我之前没有提到它,因为这里没有 Android 特定的对象在起作用。 LogCat 输出不是很有帮助
02-03 02:47:43.660:错误/AndroidRuntime(5258):未捕获的处理程序:线程主因未捕获的异常而退出 02-03 02:47:43.670: 错误/AndroidRuntime(5258): java.util.ConcurrentModificationException 02-03 02:47:43.670: 错误/AndroidRuntime(5258): 在 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)//
我试图同步的对象本质上是一个名为 gs 的 GameState。它包含各种 ArrayList、数组和其他对象。 gs 不是静态的。
上面出现问题的方法是:
for(GameUnit gu : this.getBase().getGameState().getAllUnits()){//<---this is the problem line.
//do some stuff...
}
getAllUnits 返回 GameUnits 的 ArrayList(包括调用该方法的 GameUnit - 我不需要迭代器,因为没有对象被删除或创建)。
【问题讨论】:
-
向我们展示真实的代码,以及异常的堆栈跟踪。 ConcurrentModificationException 可能与多线程无关。
-
细节太少,无法提供与您的情况相关的具体建议。向我们展示您的实际代码。
-
我更新了它。我希望更新的信息有用
标签: java android multithreading synchronized concurrentmodification