1. Fail-Fast (fail—fast)
При использовании итератора для обхода объекта коллекции, если содержимое объекта коллекции изменяется (добавляется, удаляется или изменяется) во время обхода, будет выброшено исключение Concurrent Modification Exception.
Принцип:Итератор во время обхода напрямую обращается к содержимому коллекции и использует переменную modCount во время обхода. Если содержимое коллекции изменяется во время обхода, значение modCount будет изменено. Каждый раз, когда итератор использует hashNext()/next() для перехода к следующему элементу, он проверяет, равно ли значение переменной modCount значению expectedmodCount. Если да, он продолжает обход; иначе он выбрасывает исключение и завершает обход.
Примечание:Условием выброса исключения здесь является обнаружениеmodCount != expectedmodCountэтого условия. Если значение modCount устанавливается обратно в значение expectedmodCount как раз при изменении коллекции, исключение не будет выброшено. Поэтому нельзя полагаться на то, выбрасывается ли это исключение при программировании параллельных операций; это исключение рекомендуется только для обнаружения ошибок при параллельных изменениях.
Сценарии:Классы коллекций в пакете java.util все являются fail-fast и не могут параллельно изменяться в многопоточной среде (изменяться во время итерации).
2. Отказоустойчивый (fail-safe)
Контейнеры коллекций, использующие механизм fail-safe, во время обхода не обращаются напрямую к содержимому коллекции; вместо этого они сначала копируют исходное содержимое коллекции и обходят скопированную коллекцию.
Принцип:Поскольку при итерации обходится копия исходной коллекции, изменения, внесённые в исходную коллекцию во время обхода, не могут быть обнаружены итератором, поэтому Concurrent Modification Exception не будет вызвано.
> Недостатки: Преимущество копирования содержимого заключается в том, что оно позволяет избежать Concurrent Modification Exception, но аналогично итератор не может получить доступ к изменённому содержимому. То есть итератор обходит копию коллекции, полученную на момент начала обхода, и итератор не знает об изменениях, внесённых в исходную коллекцию во время обхода.
Сценарии:Все контейнеры пакета java.util.concurrent являются fail-safe; их можно параллельно использовать и изменять в многопоточной среде.
Исходный URL: http://www.cnblogs.com/ygj0930/p/6543350.html