Этот вопрос больше о том, спрашивает ли мой способ сделать что-то «правильно» или нет. У меня есть программа, которая включает в себя постоянное обновление графических компонентов. Для этого у меня есть метод ниже.Конкурентоспособная модификация и синхронизация arraylists
public void update(){
for (BaseGameEntity movingEntity : movingEntityList) {
((MovingEntity)movingEntity).update();
}
}
По существу, класс, содержащий этот метод имеет список всех графических объектов, которые нуждаются в обновлении и перебирает, называя их соответствующие методы обновления.
Проблема возникает, когда мне приходится добавлять новые сущности или удалять текущие объекты из этого списка. Добавление и удаление объектов обрабатывается другим потоком, и, как вы можете догадаться, это приводит к исключению параллельной модификации, если я пытаюсь добавлять/удалять объекты, а также перебирать и обновлять свои графические компоненты.
Моим решением было просто бросить блок try-catch вокруг этого и просто игнорировать любые одновременные модификации, которые возникают, а не обновляются в это конкретное время. Это делает именно то, что я хочу, и никаких проблем не возникает.
public void update(){
try{
for (BaseGameEntity movingEntity : movingEntityList) {
((MovingEntity)movingEntity).update();
}
}catch(ConcurrentModificationException e){
//Do Nothing
}
}
Однако, мой вопрос заключается в том, является ли это «правильным» способом решения этой проблемы? Должен ли я делать что-то похожее на то, что указано в this answer? Каков «правильный» способ справиться с этой проблемой, если мой не так? Я не смотрю конкретно на способы сделать мой поток arraylist безопасным, например, через синхронизированные списки, я специально спрашиваю, является ли мой метод допустимым методом или если есть какая-то причина, я должен избегать этого и фактически использовать синхронизированный список.
Как уже говорилось, моя программа работает очень хорошо, как и у меня. Я технически пропустил несколько обновлений, но дополнения и удаления настолько малы, что это не имеет значения. Поэтому мои основные вопросы: если я буду беспокоиться о синхронизации, если мой путь уже работает. – zephyr