У меня есть два потока, модифицирующих один и тот же объект, скажем, MyObject, и поэтому я синхронизировал объект. Но в одном из потоков другой объект модифицируется и при этом должен вызывать MyObject.
* 1003 Т.е. *
public void run(){
synchronized(MyObject){
...
anotherObject.modify();//<----calls MyObject
...
}
}
Это вызывает исключения ConcurrentModificationException. Я не знаю, как это решить. Если я не синхронизируюсь, я получаю исключения, поскольку оба потока пытаются вызвать 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): at com.jjg.myapp.gameunit.findEnemy (MoveableUnit.java:656) // <--- в этом методе коллекции Gamestate повторяются
02-03 02: 47: 43.670: ОШИБКА / AndroidRuntime (5258): на com.jjg.myapp.gameunit.update (GameUnit.java:416) </p>
Объект, который я пытался синхронизировать, по сути, является GameState с именем gs. Здесь размещен ассортимент ArrayLists, массивов и других объектов. GS не является статичным.
Метод, описанный выше, где возникает проблема:
for(GameUnit gu : this.getBase().getGameState().getAllUnits()){//<---this is the problem line.
//do some stuff...
}
getAllUnits возвращает ArrayList для GameUnits (включая GameUnit, вызывающий метод - мне не нужен итератор, поскольку никакие объекты не удаляются и не создаются).