2013-12-22 5 views
5

Gibt es einen Container, der die List-Schnittstelle implementiert, die gleichzeitige Änderungen während der Iteration unterstützt? Insbesondere möchte ich, dass ein Thread über die Sammlung iteriert, während viele Threads Elemente aus dieser Liste einfügen und entfernen. Der Iterator sollte Änderungen an der Liste sehen, die er noch nicht durchlaufen hat.Gibt es eine Auflistung von Listen, die gleichzeitige Änderungen während der Iteration unterstützen?

Ich suche nach Iterationsverhalten ähnlich einer ConcurrentLinkedQueue, aber mit Unterstützung für das Hinzufügen und Entfernen von Elementen bei bestimmten Indizes. Vorzugsweise suche ich nach einer starken Konsistenz (und bin willens, dafür einen Overhead zu zahlen), aber ich könnte wahrscheinlich mit einer schwachen Konsistenz leben.

Ich freue mich, Bibliotheken von Drittanbietern zu sehen, da ich nichts in der Standardbibliothek sehen kann, die das bietet, wonach ich suche.

+0

Entschuldigung, mir war nicht bewusst, dass dies nicht zum Thema gehörte. Es war nicht meine Absicht, Meinungen einzuholen, sondern herauszufinden, ob etwas existiert, das meinen Bedürfnissen entspricht. –

Antwort

5

Da ist etwas in der Nähe. Es heißt CopyOnWriteArrayList - obwohl die Einschränkung dort ist, dass ein Iterator keine Änderungen sehen wird, während er iteriert, stattdessen wird er weiter über die Sammlung iterieren, wie es war, als die Iteration gestartet wurde.

Diese Sammlung ist langsam auf schreibt (aber schnell beim Lesen), die eine andere Sache zu prüfen ist.

jME3 hat eine interne Sammlung namens SafeArrayListdoc here, die zwar schneller ist, aber keinen Multi-Thread-Zugriff unterstützt. Es unterstützt den Zugriff von Iteratoren usw. tho (Sie können also Ihre Objekte in der Liste durchlaufen und gleichzeitig hinzufügen/entfernen, solange Sie dies nicht von mehreren Threads aus tun). Wiederum werden Iteratoren keine Änderungen sehen, wenn sie iterieren, sie werden weiterhin über die ursprünglichen Daten iterieren.

Das Concurrent-Paket bietet eine Reihe weiterer Datenstrukturen, die ebenfalls hilfreich sein können.

Eine Alternative wäre, einfach einen Standard ArrayList, synchronize auf der Liste für die Modifikation zu verwenden und zu lesen und dann über ihn mit Index zu iterieren. (d. h. list.get(i)).

Es wird jedoch viele Randfälle geben. Wenn Sie beispielsweise ein Element entfernen, werden alle anderen Elemente nach unten verschoben, sodass Sie bei allen Iteratoren nach diesem Punkt eine überspringen.

In der Tat können Sie am Ende müssen eine Liste von Iteratoren zu halten und wenn Sie Elemente hinzufügen/entfernen Schleife durch Ihre Liste von Iteratoren und aktualisieren Sie ihre Positionen entsprechend!

0

Mit der Java-API allein können Sie die Collections.synchronizedList() verwenden, um eine synchronisierte Liste zu erhalten. Überprüfen Sie, ob die Spezifikation der Methode zu Ihrer Verwendung passt. Und verwenden Sie die ListIterator (erhalten mit der List.listIterator()-Methode), um die Liste zu iterieren und zu ändern.

+0

Das wird nicht funktionieren, es sperrt die Liste für Änderungen während der Iteration. –

+0

Aber die Sammlung für Schreibvorgänge sperren sollte noch in Ordnung sein, nicht? – Neel

+0

Er möchte einen Iterator, der die während der Iteration vorgenommenen Änderungen sieht. Sie können keine Änderungen vornehmen, wenn die Sammlung gesperrt ist ... –

Verwandte Themen