it-swarm.com.de

Gibt es eine gleichzeitige Liste in Java JDK?

Wie kann ich eine gleichzeitige List-Instanz erstellen, in der ich über einen Index auf Elemente zugreifen kann? Verfügt das JDK über Klassen oder Factory-Methoden, die ich verwenden kann?

238

Es gibt eine gleichzeitige Listenimplementierung in Java.util.concurrent . CopyOnWriteArrayList insbesondere.

154
user177800

Wenn Sie sich nicht für einen indexbasierten Zugriff interessieren und nur die Eigenschaften einer Liste zum Beibehalten der Einfügereihenfolge wünschen, können Sie ein Java.util.concurrent.ConcurrentLinkedQueue in Betracht ziehen. Nachdem Sie alle Elemente hinzugefügt haben, können Sie den Inhalt mit der erweiterten Syntax durchlaufen, da Iterable implementiert ist:

Queue<String> globalQueue = new ConcurrentLinkedQueue<String>();

//Multiple threads can safely call globalQueue.add()...

for (String href : globalQueue) {
    //do something with href
}
138
Matt Passell

Sie können Collections.synchronizedList (List) sehr gut verwenden, wenn Sie nur eine einfache Aufrufsynchronisation benötigen:

 List<Object> objList = Collections.synchronizedList(new ArrayList<Object>());
119
Yanick Rochon

Da der Vorgang des Erfassens der Position und des Abrufens des Elements von der angegebenen Position natürlich eine gewisse Sperrung erfordert (die Liste kann keine strukturellen Änderungen zwischen diesen beiden Vorgängen aufweisen).

Die Idee einer gleichzeitigen Sammlung ist, dass jede Operation für sich genommen atomar ist und ohne explizites Sperren/Synchronisieren ausgeführt werden kann.

Daher ist es in einer Situation, in der ein gleichzeitiger Zugriff erwartet wird, nicht sinnvoll, das Element an der Position n von einer gegebenen List als atomare Operation abzurufen.

41
Joachim Sauer