Questa domanda è un caso più particolare del problema descritto (e risolto) in this question.Java: come rimuovere elementi da un elenco mentre si itera/aggiungendo ad esso
Ho due metodi, stopAndRemove (ServerObject server) e un metodo close(). L'ultimo dovrebbe chiudere tutti i server e rimuoverli dall'elenco dei server. La lista è definita come
List<ServerObject> server.
Io non voglio avere quasi lo stesso codice stopAndRemove in closeCurrentlyOpen, quindi voglio fare qualcosa di simile:
public void closeCurrentlyOpen() {
for(ServerObject server : this.servers) {
stopAndRemove(server)
}
}
Questo non funziona, in quanto questo causerà una ConcurrentModificationException. Ho provato a fare una copia della lista
List<ServerObject> copyList = new ArrayList<ServerObject>(this.servers);
e usarlo come elenco per il ciclo foreach. Ma allora potrebbe essere possibile che un altro thread accoda un server alla lista dei server mentre sto iterando su copyList ma closeCurrentlyOpen dovrebbe generare un elenco emtpy. Come il metodo addServerToList è sincronizzato con il server-list, facendo questo
public void closeCurrentlyOpen() {
synchronized(this.servers) {
for(ServerObject server : this.servers) {
stopAndRemove(server)
}
}
}
risolverà il problema con le modifiche. Ma allora non posso sincronizzare il codice nel metodo stopAndRemove che è necessario se viene chiamato direttamente.
Mi sembra che il design di questi tre metodi abbia probabilmente bisogno di un workover. Idee qualcuno?
Ho fatto così ... fermare tutti gli elementi dal ciclo di stop, quindi list.clean() per rimuovere tutto. Sì, "e" è l'odore del codice qui. Ho dato questo nome nell'esempio quindi non ho bisogno di descrivere quello che faccio. – Arvodan