2014-12-19 3 views
0

I цикл через копию набора объектов, но она по-прежнему дает мне ошибку, начиная с этого метода:Java - странно ConcurrentModificationException

private static Set<Updated> updates = new HashSet<>(); 
public static Set<GameObject> getGameObjects() { 
    Set<GameObject> objs = new HashSet<>(); 
    for (Updated up : new HashSet<Updated>(updates)) { 
     if (up instanceof GameObject) 
      objs.add((GameObject) up); 
    } 
    return objs; 
} 

(Если для петли). Это происходит только в том случае, когда имеется довольно много GameObjects, и никогда не возникает, когда есть только несколько (например, 7). Спасибо!

+6

Откуда: Где? Единственное место в этом коде, которое может вызвать ConcurrentModificationException, - это новое создание HashSet; CME произойдет, если «обновления» будут изменены из другого потока. – yole

+0

GameObjects реализуют обновление и добавляются в набор при создании. – MCMastery

+2

Есть ли другой поток, который может изменить этот набор? – yole

ответ

1

Проблема заключается в том, что кто-то в другом потоке изменяет updates набор в то время как он был скопирован в new HashSet<Updated>(updates).

Вы не можете сделать это без синхронизации. Или использовать ConcurrentHashMap вместо HashSet

+0

Также обратите внимание, что для такого простого цикла вам не нужно делать копии обновлений. Это просто означает, что вы повторяете дважды. Вы можете сделать копию, если вам нужен снимок значений для использования в течение более длительного периода. – user12722

+1

Это неправда. Вам, безусловно, нужна копия, если вы не используете 'ConcurrentHashMap' или не хотите синхронизировать весь цикл. – Dima

+0

Синхронизация работала, спасибо. – MCMastery

Смежные вопросы