3 ответов:
в чем разница между ними ...
"Fail safe" означает: он не подведет. Строго говоря, есть ничего подобного в Java как отказоустойчивый итератор. Правильный термин - "слабо согласуется". Документация javadoc говорит:
"большинство параллельных реализаций коллекции (включая большинство очередей) также отличаются от обычной java.утиль конвенций в том, что их итераторы и Spliterators предоставить слабо последовательный, а не быстрый обход отказа."
как правило, слабая согласованность означает, что если коллекция изменяется одновременно с итерацией, гарантии того, что итерация видит, слабее. (Подробности будут указаны в каждом классе коллекции conncurrent javadocs.)
"Fail fast" означает: it мая не получится ... и условие отказа проверяется агрессивно, так что условие отказа (где возможно1) обнаружены до повреждение можно сделать. В Java итератор fail-fast терпит неудачу, бросая
ConcurrentModificationException.альтернативой "fail-fast" и "слабо согласованной" является семантика, где итерация непредсказуемо терпит неудачу; например, иногда давать неправильный ответ или бросать совершенно неожиданное исключение. (Это было поведение некоторых стандартных реализаций
EnumerationAPI в ранних версиях 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