5. Какая разница между итераторами с fail-fast и fail-safe поведением? (С примерами)

5. Какая разница между итераторами с fail-fast и fail-safe поведением? (С примерами)

UNKNOWN

fail-fast поведение означает, что при возникновении ошибки или состояния, которое может привести к ошибке, система немедленно прекращает дальнейшую работу и уведомляет об этом.

Использование fail-fast подхода позволяет избежать недетерминированного поведения программы в течение времени. В Java Collections API некоторые итераторы ведут себя как fail-fast и выбрасывают ConcurrentModificationException, если после его создания была произведена модификация коллекции, т.е. добавлен или удален элемент напрямую из коллекции, а не используя методы итератора.

Реализация такого поведения осуществляется за счет подсчета количества модификаций коллекции (modification count):

  • при изменении коллекции счетчик модификаций так же изменяется;
  • при создании итератора ему передается текущее значение счетчика;
  • при каждом обращении к итератору сохраненное значение счетчика сравнивается с текущим, и, если они не совпадают, возникает исключение.
    Итераторы по умолчанию для Collections из java.util package , такие как ArrayList , HashMap и т. д., Являются Fail-Fast

ArrayList<Integer> numbers =//...
Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
Integer number = iterator.next();
numbers.add(50);
}

В приведенном выше фрагменте кода ConcurrentModificationException генерируется в начале следующего цикла итерации после выполнения модификации. итераторы fail-safe не вызывают никаких исключений при изменении структуры, потому что они работают с клоном коллекции вместо оригинала.

Итератор коллекции CopyOnWriteArrayList и итератор представления keySet коллекции ConcurrentHashMap являются примерами итераторов fail-safe.


Предыдущий вопрос: 4. В чем разница между классами java.util.Collection и java.util.Collections?

Следующий вопрос: 6. Чем различаются Enumeration (устаревший) и Iterator?

Все вопросы по теме: список

Все темы: список

Вопросы/замечания/предложения/нашли ошибку:напишите мне

Report Page