Есть ли в Java структура данных, поддерживающая параллельную модификацию?

Я делаю игру на Java. Каждый враг в игре — это поток, и они постоянно перебирают структуры данных игры (я всегда использую класс Vector).

В последнее время я получаю «ConcurrentModificationException», потому что элемент добавляется/удаляется из вектора, пока поток проходит через него. Я знаю, что есть стратегии, позволяющие избежать проблемы с добавлением/удалением (на самом деле я использую некоторые, чтобы избежать проблем с удалением, но у меня все еще есть проблемы с «добавлением»).

Я слышал, что java поддерживает вектор/список, который позволяет избежать исключения ConcurrentModificationException.

Вы хоть представляете, что это за структура? Спасибо.


person Rama    schedule 25.11.2011    source источник


Ответы (2)


CopyOnWriteArrayList. Но внимательно прочитайте его javadocs и подумайте, дает ли на практике ожидаемое поведение (проверьте эффекты согласованности памяти), а также стоит ли это накладных расходов на производительность. Помимо синхронизации с ReentrantReadWriteLock, AtomicReferences и Collections.synchronizedList может тебе помочь.

person Anthony Accioly    schedule 25.11.2011
comment
Не забудьте связать текущую документацию. - person Hunter McMillen; 26.11.2011

Ознакомьтесь с java.util.concurrent. что вы ищете.

person Matt Fenwick    schedule 25.11.2011
comment
Не забудьте связать текущую документацию - person Hunter McMillen; 26.11.2011
comment
@HunterMcmillen - спасибо за предупреждение, теперь исправлено. (текущая версия 1.7, верно?) - person Matt Fenwick; 26.11.2011
comment
ConcurrentModificationException не обязательно имеет какое-либо отношение к параллелизму на основе потоков; достаточно легко спровоцировать в программе доступ к коллекциям только в одном потоке. Хотя это правда, что коллекции, решающие проблему OP, находятся в упомянутом вами пакете, я думаю, что необходимо больше пояснений основной проблемы. - person seh; 26.11.2011