У меня есть два потока, изменяющие один и тот же объект, скажем, MyObject, и поэтому синхронизировали объект. Но в одном из потоков другой объект модифицируется и при этом должен вызывать MyObject.
I.e.
public void run(){
synchronized(MyObject){
...
anotherObject.modify();//<----calls MyObject
...
}
}
Это вызывает ConcurrentModificationExceptions. Я не знаю, как это решить. Если я не синхронизируюсь, я получаю исключения, поскольку оба потока пытаются вызвать MyObject. Как я могу это исправить?
ОБНОВЛЕНИЕ: код предназначен для устройства Android. Я не упоминал об этом раньше, потому что здесь нет конкретных объектов для Android. Выход LogCat не очень полезен
02-03 02:47:43.660: ERROR/AndroidRuntime(5258): обработчик необработанных данных: основной поток завершается из-за необработанного исключения 02-03 02:47:43.670: ERROR/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)
Объект, который я пытался синхронизировать, по сути является GameState с именем gs. Он содержит ассортимент ArrayList, массивов и других объектов. gs не статичен.
Метод выше, где возникает проблема:
for(GameUnit gu : this.getBase().getGameState().getAllUnits()){//<---this is the problem line.
//do some stuff...
}
getAllUnits возвращает ArrayList GameUnits (включая GameUnit, вызывающий метод — мне не нужен итератор, поскольку никакие объекты не удаляются и не создаются).