в классе Я эти 2 метода:Неясная ConcurrentModificationException на отдельных списках
public void notifyResult(List<Road> result) {
ArrayList<RoadOverlay> tempRoads = new ArrayList<>();
for(Road road:result){
// Computes and stores the overlays
// ...
tempRoads.add(new RoadOverlay());
}
//switch field when update is done
this.positions = tempRoads;
}
}
private void drawRoadsVO(GL gl) {
// keep a reference on the current instance of the field
// to avoid concurrent modification in notifyResult
ArrayList<RoadOverlay> positionsCopy = this.positions;
int vertexCount = 0;
for (RoadOverlay road : positionsCopy) { //ConcurrentModificationException here
// ...
}
}
Оба метода проложены в разных потоках. Внутри рендеринга я не делаю никаких изменений в списке, и, насколько я понимаю, я работаю над отдельными списками, так как это может привести к CME? Я борюсь за это, и любой ключ приветствуется. Насколько это возможно, я стараюсь избежать штрафа за использование синхронизации.
С уважением
Отредактировано комментарий в коде
'// работа на копии, чтобы избежать одновременного modification' Вы не копировать список. У вас есть только две ссылки, указывающие на один и тот же экземпляр. –
Я знаю, что это не мелкая копия, но она должна была нести обход в одном экземпляре. Вы думаете, что это бесполезно? – raggnic
Проблема в том, что, как вы сказали, ваши методы работают на отдельных потоках. Когда вы работаете в одном экземпляре, один поток может изменить список, пока вы читаете его в 'drawRoadsVO' (вот почему CME выбрасывается). Таким образом, либо вам нужно сделать глубокую копию перед чтением, либо использовать структуру данных, защищенную потоком. –