Что такое отказоустойчивые и отказоустойчивые итераторы в Java [закрыто]



в Java есть два типа итераторов: fail-safe и fail-fast.



Что это значит, и разница между ними?

660   3  

3 ответов:

в чем разница между ними ...

"Fail safe" означает: он не подведет. Строго говоря, есть ничего подобного в Java как отказоустойчивый итератор. Правильный термин - "слабо согласуется". Документация javadoc говорит:

"большинство параллельных реализаций коллекции (включая большинство очередей) также отличаются от обычной java.утиль конвенций в том, что их итераторы и Spliterators предоставить слабо последовательный, а не быстрый обход отказа."

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

"Fail fast" означает: it мая не получится ... и условие отказа проверяется агрессивно, так что условие отказа (где возможно1) обнаружены до повреждение можно сделать. В Java итератор fail-fast терпит неудачу, бросая ConcurrentModificationException.

альтернативой "fail-fast" и "слабо согласованной" является семантика, где итерация непредсказуемо терпит неудачу; например, иногда давать неправильный ответ или бросать совершенно неожиданное исключение. (Это было поведение некоторых стандартных реализаций Enumeration API в ранних версиях Java.)

... и они отличаются от итератора, который мы используем для коллекции.

нет. Это свойства итераторов, реализованных стандартными типами коллекций; т. е. они либо "быстро отказывают", либо "слабо согласованы" ... при правильном использовании в отношении синхронизации и модели памяти Java1.


сбой быстро Iterators являются обычно реализовано с помощью volatile счетчик на сбор объект.

  • при обновлении коллекции счетчик увеличивается.
  • когда Iterator создается, текущее значение счетчика встроено в Iterator "объект".
  • когда Iterator операция выполняется, метод сравнивает два значения счетчика и выдает CME, если они отличаются.

реализация отказоустойчивых итераторов обычно является легкой. Они обычно полагаются на свойства структуры данных конкретной реализации списка. Здесь нет общей закономерности. (Читать исходный код для конкретных классов коллекций, которые вас интересуют.)


1 - всадник является то, что fail-fast поведение предполагает, что идентификатор приложения правильно по отношению к синхронизации и модели памяти. Это означает, что (например) если вы повторяете ArrayList без надлежащей синхронизации конечным результатом может быть поврежденный результат списка. "Быстрый сбой" механизм, вероятно, обнаружит параллельную модификацию (хотя это не гарантировано), но он не обнаружит основное повреждение. В качестве примера,документация на Vector.iterator() говорит:

" быстрое поведение итератора не может быть гарантировано, поскольку, вообще говоря, невозможно сделать какие-либо жесткие гарантии при наличии несинхронизированной параллельной модификации. Сбой быстро Iterators кинуть ConcurrentModificationException на основе максимальных усилий. Поэтому было бы неправильно писать программу, которая зависела бы от этого исключения для ее корректности: быстрое поведение итераторов должно использоваться только для обнаружения ошибок."

они скорее fail-fast и слабо согласуется типа:

итераторы от бросить ConcurrentModificationException если коллекция была изменена методами коллекции (add / remove) во время итерации

итераторы от java.util.concurrent пакет обычно выполняет итерацию по моментальному снимку и разрешает одновременные изменения, но может не отражать обновления коллекции после создания итератора.

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

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

итератор CopyOnWriteArrayList является примером отказоустойчивого итератора также итератор, написанный ConcurrentHashMap keySet также является отказоустойчивым итератор и никогда не бросать ConcurrentModificationException в Java.

Comments

    Ничего не найдено.