Этот вопрос является более частным случаем проблемы, описанной (и решенной) в этом вопросе .
У меня есть два метода: stopAndRemove (сервер ServerObject) и метод close (). Последний должен закрыть все серверы и удалить их из списка серверов. Список определяется как
List<ServerObject> server.
Я не хочу иметь почти такой же код из stopAndRemove в closeCurrentlyOpen, поэтому я хочу сделать что-то вроде:
public void closeCurrentlyOpen() {
for(ServerObject server : this.servers) {
stopAndRemove(server)
}
}
Это не будет работать, так как это вызовет исключение ConcurrentModificationException. Я пытался сделать копию списка
List<ServerObject> copyList = new ArrayList<ServerObject>(this.servers);
и используйте это как список для цикла foreach. Но тогда может быть возможно, что другой поток добавляет сервер в список серверов, пока я перебираю copyList, но closeCurrentlyOpen должен получить список emtpy.
Поскольку метод addServerToList синхронизируется со списком серверов, выполните следующие действия:
public void closeCurrentlyOpen() {
synchronized(this.servers) {
for(ServerObject server : this.servers) {
stopAndRemove(server)
}
}
}
решит проблему с модификациями. Но тогда я не могу синхронизировать код в методе stopAndRemove, который необходим, если он вызывается напрямую.
Мне кажется, что разработка этих трех методов, вероятно, нуждается в капитальном ремонте.
Идеи кто-нибудь?