2013-11-22 16 views
7

Ausfallsichere Iteratoren sind diejenigen, die nicht throwConcurrentModificationException.Fail-Safe-Iteratoren und schwach konsistente Iteratoren

Aber was ist der Unterschied zwischen fail safe iterators und weakly consistent iterators?

Sind beide gleich?

+0

http://StackOverflow.com/Q/14084104/469220 – Vlad

+3

Nein beide sind nicht gleich –

+1

http://StackOverflow.com/Questions/14084104/concurrenthashmap-returns-a-weakly-consistent-iterator-why-should-we -use-it-any –

Antwort

8

Sowohl Fail-safe als auch Weakly consistent Iteratoren werfen nicht ConcurrentModificationException.

weakly consistent iterators: Kollektionen, die auf CAS verlassen (Vergleichs- und Swap) haben schwach konsistente Iteratoren, die einige spiegeln aber nicht unbedingt alle Änderungen, die ihre Unterstützung Sammlung gemacht wurden, da sie erstellt wurden. Wenn zum Beispiel Elemente in der Sammlung geändert oder entfernt wurden, bevor der Iterator sie erreicht, werden sie definitiv diese Änderungen widerspiegeln, aber es wird keine solche Garantie für Einfügungen gegeben.

Fail safe iterator Der Iterator-Mechanismus erstellt eine Kopie der internen Collection-Datenstruktur und verwendet sie, um über die Elemente zu iterieren. Dies verhindert, dass gleichzeitige Änderungsausnahmen ausgelöst werden, wenn sich die zugrunde liegende Datenstruktur ändert. Natürlich wird der Overhead des Kopierens des gesamten Arrays eingeführt.

CopyOnWriteArrayList ist eine solche Implementierung mit Fail-Safe-Iterator, die wir leicht durch einen Blick auf die Konstrukteurs-Quelle sehen:

public CopyOnWriteArrayList(Collection<? extends E> c) { 
     Object[] elements = c.toArray(); 

     if (elements.getClass() != Object[].class) 
      elements = Arrays.copyOf(elements, elements.length, Object[].class); 
     setArray(elements); 
    } 

Referenz:

  1. Java Generics and Collections: 11.5. Collections and Thread Safety
  2. Iterators – Fail fast Vs Fail safe