Как правило, это работает следующим образом:
class MyCollection implements Collection<E /* or whatever the elements are */> {
private int modCount = 0;
private class MyIterator implements Iterator<E> {
private int expectedModCount;
public MyIterator() {
expectedModCount = modCount;
}
@Override
public E next() {
if(expectedModCount != modCount) throw new ConcurrentModificationException();
}
// etc.
}
@Override
public Iterator<E> iterator() {
return new MyIterator();
}
@Override
public boolean add(E e) {
modCount++;
// etc.
}
// etc.
}
Каждый MyIterator
знает , чего ожидать modCount
, запоминая значение в виде поля. Ваши итераторы 1 и 2 не будут сбиты с толку, потому что они будут отдельными объектами с отдельными полями с отдельными значениями, что означает, что они будут ожидать разные modCount
s. Кроме того, обратите внимание, что ConcurrentModificationException
s выбрасываются "опросом", а не "уведомлением". Коллекция не должна отслеживать свои итераторы и уведомлять их о модификации при вызове метода в коллекции. Скорее, каждый итератор проверяет, была ли изменена коллекция, когда вы вызываете метод на итераторе. Если вы никогда не будете использовать итератор после изменения коллекции, у него никогда не будет возможности вызвать исключение, поэтому в вашем примере исключение не будет выдано, и это правильное поведение.