Из javadoc ConcurrentModificationException :
Обратите внимание, что это исключение не всегда означает, что объект одновременно был изменен потоком , отличным от .Если один поток выдает последовательность вызовов методов, которая нарушает контракт объекта, объект может вызвать это исключение.Например, если поток изменяет коллекцию напрямую, в то время как он выполняет итерацию по коллекции с помощью итератора с быстрой ошибкой, итератор сгенерирует это исключение.
Так что в вашем случае кажется, что o.notify(model)
изменяет this.observers
- прямо или косвенно.Это обычное явление при изменении коллекции, для которой вы выполняете итерацию.
Чтобы избежать одновременного изменения, вы можете работать с копией коллекции следующим образом:
for(Observer<ModelViewInterface> o :
new ArrayList<ModelViewInterface>(this.observers)) {
o.notify(model);
}
Однако иногдаэто не то, что вам нужно - текущее поведение o.notify
также может указывать на ошибку.