同じオブジェクト、たとえば MyObject を変更する 2 つのスレッドがあり、オブジェクトを同期しました。しかし、スレッドの 1 つで別のオブジェクトが変更されているため、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: エラー/AndroidRuntime(5258): 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 です。ArrayLists、配列、およびその他のオブジェクトの品揃えを収容します。gs は静的ではありません。
問題が発生する上記の方法は次のとおりです。
for(GameUnit gu : this.getBase().getGameState().getAllUnits()){//<---this is the problem line.
//do some stuff...
}
getAllUnits は、GameUnits の ArrayList を返します (メソッドを呼び出す GameUnit を含む - オブジェクトが削除または作成されないため、反復子は必要ありません)。