Was ist die Logik eines fehlersicheren Iterators?

8

Wenn der fehlersichere Iterator eine separate Kopie erstellt und daran arbeitet, woher weiß er, dass Änderungen am Original vorgenommen wurden?

%Vor%

Die Ausgabe ist:

%Vor%     
pujan jain 13.07.2016, 00:59
quelle

1 Antwort

12

Es gibt keinen "fehlersicheren" Iterator in Java. Zumindest definieren die Java SE-Spezifikationen keinen solchen Begriff. Ich empfehle daher, den Begriff "fehlersicher" zur Beschreibung von Java-Iteratoren zu vermeiden.

Ich bin mir bewusst, dass verschiedene Artikel im Internet und anderswo auf Stack Overflow den Begriff "fail-safe" verwenden, aber ihre Verwendung ist nicht definitiv, und es ist wahrscheinlich falsch oder zumindest irreführend. Ich glaube, Sie wurden durch solche Dokumentation in die Irre geführt.

Es hört sich so an, als hätten Sie irgendwo gelesen, dass ein "fehlersicherer" Iterator auf einer separaten Kopie arbeitet. In Ihrem Beispiel verwenden Sie eine ConcurrentHashMap , die in der Tat Iteratoren enthält, die nicht Fail-Fast sind. Die Iteratoren von CHM funktionieren jedoch nicht auf einer Kopie. Stattdessen haben sie eine Semantik, die in der offiziellen Spezifikation als schwach konsistent . Die Definition ist etwas abstrus, aber im Wesentlichen ist jedes Element, das von einem solchen Iterator gemeldet wird, zu irgendeinem Zeitpunkt in der Sammlung vorhanden. Diese Art von Iteratoren spiegelt möglicherweise Änderungen an der Sammlung wider, die nach dem Start der Iteration vorgenommen wurden. Aus diesem Grund sieht der Thread, der den Iterator ausführt, Änderungen, die vom anderen Thread vorgenommen wurden. (Es ist auch möglich, dass einige oder keine der Änderungen sichtbar sind, da diese Threads ein Datenrennen haben.)

Ein Beispiel für eine andere Sammlung, deren Iteratoren nicht fail-fast sind, ist CopyOnWriteArrayList . Die Iteratoren dieser Auflistung arbeiten mit einem Snapshot, sodass nachfolgende Änderungen an der Auflistung über einen Iterator nie sichtbar sind.

Der Vollständigkeit halber ist hier die Definition eines fail-fast Iterator aus der ArrayList -Spezifikation. Die meisten anderen Sammlungen (nicht gleichzeitig) in Java haben eine Fail-Fast-Iterationsrichtlinie, die ähnlich definiert ist.

    
Stuart Marks 13.07.2016 02:54
quelle

Tags und Links