Добавление элемента в одном месте и одновременное удаление в другом месте требует синхронизации.
A) Использование Вектор .
Вектор обеспечивает синхронизациюиз коробки.Но даже для Vector не использует Iterator , потому что у вас есть одновременные модификации.
// On the place where you create your list now, create a Vector,
// like ... = new Vector<...>() instead of ... = new ArrayList<...>().
// Just a cast is not sufficient of course.
Vector<OfflineCommand> l_loc = ...;
if (l_loc != null) {
boolean flgSuccess = true;
while (!l_loc.isEmpty()) {
OfflineCommand oc = l_loc.get(0);
flgSuccess = executeOfflineCommand(oc);
if (!flgSuccess) {
break;
} else {
l_loc.remove(0);
}
}
}
Преимущество: вам не нужна явная синхронизация.Ваш код остается компактным.
B) Используйте явную синхронизацию.
List<OfflineCommand> l_loc = ...;
if (l_loc != null) {
boolean flgSuccess = true;
while (!l_loc.isEmpty()) {
OfflineCommand oc = l_loc.get(0);
flgSuccess = executeOfflineCommand(oc);
if (!flgSuccess) {
break;
} else {
synchronized (l_loc) {
l_loc.remove(0);
}
}
}
}
Важно: В месте, где вы добавляете объекты в этот список, вы также должны использовать синхронизацию:
synchronized(l_loc) {
l_loc.add(...);
}
Второй подход не так надежен, потому что вы должны помнить все места, где ваш список может быть изменен, и использовать синхронизацию там.
Оба эти подхода, A и B, решит проблему с одновременной модификацией.