Soweit ich das beurteilen kann, liegt der Grund in dem Teil von Javadoc, den Sie nicht zitiert haben (Hervorhebung unter meinem):
Ein Iterator für Listen, mit dem der Programmierer die Liste in beide Richtungen durchlaufen und die Liste während der Iteration ändern kann ...
Sie sehen, der beabsichtigte Zweck besteht darin, die Verwendung zuzulassen, während die Liste geändert wird. Mögliche Änderungen umfassen offenbar das Entfernen der Elemente.
Überlegen Sie nun, was passieren würde, wenn wir ein Element entfernen würden, das current()
für den Iterator bestimmt ist - vorausgesetzt, der Iterator hätte eine Vorstellung vom aktuellen Element? In diesem Zusammenhang ist die Art und Weise, wie es ohne den Begriff des aktuellen Elements implementiert wird, für mich ziemlich sinnvoll - da sich der Iterator auf diese Weise nicht um das Entfernen von Elementen kümmern muss.
Es ist wichtig zu beachten, dass für javadoc keine Schnittstellenimplementierungen erforderlich sind, um threadsicher zu sein.
- Aus diesem Grund sollte man nicht erwarten, dass Änderungen , die von verschiedenen Threads vorgenommen wurden, korrekt behandelt werden. Dazu müsste die Implementierung zusätzliche Mittel bereitstellen, um den Zugriff zu synchronisieren, die Sichtbarkeit zu gewährleisten usw., wie im Java Memory Model gemäß JSR 133 angegeben .
ListIterator ist in der Lage, Änderungen zu verarbeiten, die beim Iterieren von demselben Thread vorgenommen wurden. Nicht alle Iteratoren sind so, ConcurrentModificationException-Javadocs warnen ausdrücklich davor:
... Beachten Sie, dass diese Ausnahme nicht immer anzeigt, dass ein Objekt gleichzeitig von einem anderen Thread geändert wurde. Wenn ein einzelner Thread eine Folge von Methodenaufrufen ausgibt, die gegen den Vertrag eines Objekts verstoßen, kann das Objekt diese Ausnahme auslösen. Wenn ein Thread beispielsweise eine Sammlung direkt ändert, während er mit einem ausfallsicheren Iterator über die Sammlung iteriert, löst der Iterator diese Ausnahme aus ...