Быстрые и отказоустойчивые итераторы в Java: в чем разница?



Эта статья об итераторах Fail Fast и Fail Safe поможет вам подробно сравнить эти два итератора с соответствующими примерами.

поддерживают два типа итераторов: первый - отказоустойчивый, а второй - отказоустойчивый. Они играют жизненно важную роль, когда дело доходит до обработки исключений в Java. В этой статье «Итераторы Fail Fast и Fail Safe» мы проанализируем работу двух итераторов, а также их существенное различие.

Ниже приведены указания, которые будут обсуждаться в этой статье:





Прежде чем перейти к подробному объяснению, давайте познакомимся с концепцией параллельной модификации.

Параллельная модификация

Когда один поток (или несколько потоков) выполняет итерацию по коллекции, он может изменить структуру коллекции, либо добавив или удалив элемент в коллекции, либо обновив значение элемента в определенной позиции. Этот процесс известен как одновременное изменение.



Давайте быстро взглянем на две системы, которые касаются вышеупомянутой темы, прежде чем углубляться в детали одного и того же,

Fail Fast Sysetm:

Система считается отказоустойчивой, если она выключается сразу после возникновения ошибки. Операции немедленно прерываются, а сбои или ошибки обнаруживаются.

Отказоустойчивая система:

Система считается отказобезопасной, если она продолжает работать даже после сбоя или ошибки. Они не прерывают операцию и не скрывают ошибки, а не раскрывают их.



разница между орудиями и расширениями

Итераторы в java позволяют нам перемещаться по объектам Collection. Итераторы, возвращаемые коллекцией, по своей природе либо работают быстро, либо отказоустойчивы.

Fail Fast Iterator

Неудачные быстрые итераторы в Java запрещают любые типы структурных изменений коллекции во время итерации по ней. Структурная модификация включает добавление, удаление или обновление любого элемента коллекции во время итерации по ней. Итератор выдает исключение ConcurrentModificationException, если коллекция структурно изменена в процессе итерации.

Однако следует отметить, что если элемент удаляется с помощью собственного метода итератора, то есть метода remove (), исключение не генерируется. Это совершенно безопасный процесс. Убедитесь, что у вас есть Java установлена в вашей системе

Пример итератора Fail Fast:

import java.util.HashMap import java.util.Iterator import java.util.Map public class FailFastExample {public static void main (String [] args) {Map monthIndex = new HashMap () monthIndex.put ('1', 'January ') monthIndex.put (' 2 ',' February ') monthIndex.put (' 3 ',' March ') Итератор iterator = monthIndex.keySet (). iterator () while (iterator.hasNext ()) {System.out .println (monthIndex.get (iterator.next ())) // добавление элемента в карту // исключение будет сгенерировано при следующем вызове // метода next (). monthIndex.put ('4', 'апрель')}}}

Вывод:

Исключение в потоке «main» java.util.ConcurrentModificationException

в java.util.HashMap $ HashIterator.nextEntry (Неизвестный источник)

Теперь давайте продолжим и посмотрим на Fail Safe Iterator,

Отказоустойчивый итератор

В отличие от итераторов Fail Fast, итераторы Fail Safe не генерируют никаких исключений, если коллекция изменяется в процессе итерации. Это связано с тем, что они повторяют клон коллекции, а не саму коллекцию. Структурные изменения, внесенные в настоящую коллекцию, остаются для них незамеченными.

Однако следует отметить, что настоящего отказоустойчивого итератора не существует. Было бы уместно назвать это слабосогласованным. Это просто означает, что если Коллекция изменяется в процессе итерации, и то, что видит Итератор, слабо гарантировано. Это поведение различается для разных коллекций и задокументировано в Javadocs.

Пример отказоустойчивого итератора:

открытый класс FailSafeExample {public static void main (String [] args) {ConcurrentMap monthIndex = new ConcurrentHashMap () monthIndex.put ('1', 'Январь') monthIndex.put ('2', 'Февраль') monthIndex.put ( '3', 'March') Итератор iterator = monthIndex.keySet (). Iterator () while (iterator.hasNext ()) {System.out.println (monthIndex.get (iterator.next ())) monthIndex.put ( '4', 'апрель')}}}

Вывод:

  • Январь
  • Февраль
  • марш

Наконец, в этой статье мы будем сравнивать эти итераторы,

Различия: Fail Fast и Fail Safe Iterator

Ниже приведены существенные различия между двумя итераторами:

Параметры Fail Fast Iterator Отказоустойчивый итератор
Выбросить исключение ConcurrentModification

Да, они выбрасывают CocurrentModificationExcepti-on, если коллекция изменяется во время итерации по ней.

Нет, они не генерируют никаких исключений, если коллекция изменяется во время итерации по ней.

Клонировать коллекцию

Нет, они используют исходную коллекцию для обхода элементов.

Да, они используют копию исходной коллекции для обхода.

Накладные расходы на память

Нет, им не нужна дополнительная память.

Да, им требуется дополнительная память для клонирования коллекции.

Примеры

HashMap, Vector, ArrayList, HashSet

CopyOnWriteArrayList

Эти итераторы уникальны и очень необходимы в универсальном языке java. Хотя отказоустойчивость имеет утешительное звучание, итератор с быстрым отказом оказывается надежным.

На этом статья подошла к концу. если вы хотите узнать больше, посмотрите пользователя Edureka. Курс обучения и сертификации по Java J2EE и SOA от Edureka разработан, чтобы дать вам хорошее начало в программировании на Java и обучить как базовым, так и продвинутым концепциям Java, а также различным средам Java, таким как Hibernate и Spring.

Есть вопрос к нам? Пожалуйста, укажите это в разделе комментариев в блоге «Fail Fast vs Fail Safe», и мы свяжемся с вами как можно скорее.