So synchronisieren Sie ArrayList in Java

In Java gibt es verschiedene Container zum Speichern von Daten. Der „Anordnungsliste„ist ein solcher Container, der nicht threadsicher ist. Dies bedeutet, dass es keine gute Praxis ist, es in einer Multithreading-Umgebung ohne entsprechende Synchronisierung zu verwenden. Dieses Verfahren vermeidet das Abrufen unerwünschter oder fehlerhafter Ausgaben und stellt eine ordnungsgemäße Ressourcennutzung sicher.

In diesem Artikel wird gezeigt, wie die ArrayList in Java synchronisiert wird.

Was ist Synchronisierung in Java?

Synchronisation„in Java entspricht dem Verfahren, jeweils nur einen Thread zu aktivieren/zuzulassen, um die Aufgabe abzuschließen. Es ermöglicht nur einem Thread, eine einzelne Ressource/Aufgabe aufzurufen.

Wie synchronisiert man die Java ArrayList?

Diese Synchronisierung von ArrayList kann mit den unten angegebenen Ansätzen erfolgen:

  • Collections.synchronizedList()“ Methode.
  • CopyOnWriteArrayList“.

Ansatz 1: ArrayList mit der Methode „Collections.synchronizedList()“ synchronisieren

Diese Methode wird zum Synchronisieren von Sammlungen in Java verwendet.

Syntax

public static List<T> synchronizedList(List<T> list)

In dieser Syntax: „T” gibt den Datentyp der Liste an und das „synchronisierteListe()Die Methode nimmt List an, die sich auf die Implementierung der List-Schnittstelle bezieht, also ArrayList, LinkedList usw.

Fahren Sie nun mit der praktischen Umsetzung der besprochenen Methode fort:

import java.util.*;
public class Synchronizedlist {
public static void main (String[] args){
  List<String> x = Collections.synchronizedList(new ArrayList<String>());
  x.add("Java");
  x.add("Programming");
  x.add("Language");
  synchronized(x){
  Iterator y = x.iterator();
  while (y.hasNext())
  System.out.println(y.next());
}}
}

Laut diesem Codeblock:

  • Erstellen Sie eine ArrayList vom Typ „String“ und wenden Sie „Collections.synchronizedList()”-Methode darauf, um die Liste zu synchronisieren.
  • Hängen Sie im nächsten Schritt die angegebenen Zeichenfolgenwerte an die Liste an, indem Sie „hinzufügen()“ Methode.
  • Verwenden Sie nun den synchronisierten Block, um das nichtdeterministische Verhalten zu unterbinden.
  • Iterieren Sie in diesem Block die ArrayList über den Iterator „hasNext()“ Und „nächste()” Methoden bzw.

Ausgabe

Dieses Ergebnis impliziert, dass die ArrayList-Elemente ordnungsgemäß iteriert werden.

Nehmen wir einen anderen Code, bei dem „ConcurrentModificationException” wird gefunden, indem während der Iteration eine Zahl an die synchronisierte Liste angehängt wird:

import java.util.*;
public class Synchronizedlist {
public static void main(String[] args) {
  ArrayList<Integer> x = new ArrayList<Integer>();
  for(int i = 0; i < 5; i++) {
  x.add(i);
}
  List<Integer> z = Collections.synchronizedList(x);
  synchronized(z) {
  Iterator<Integer> y = z.iterator();
  while(y.hasNext()) {
    x.add(8);
    System.out.println(y.next());
}}
}}

In diesem Code ist das „fürDie Schleife wird angewendet, um die Werte in die ArrayList einzufügen, und die Liste wird synchronisiert. Danach wird die angegebene Ganzzahl zur Liste hinzugefügt und dadurch während der Iteration geändert, die das „ zurückgibt.ConcurrentModificationException” Einschränkung.

Ausgabe

Ansatz 2: ArrayList mit „CopyOnWriteArrayList“ synchronisieren

Der „CopyOnWriteArrayList” implementiert die List-Schnittstelle und erstellt eine Nullliste. Außerdem wird eine Liste der Elemente in der Reihenfolge der bereitgestellten Sammlung definiert.

Syntax

CopyOnWriteArrayList<T> x= new CopyOnWriteArrayList<T>();

Gemäß dieser Syntax „T„entspricht dem Datentyp der Liste.

Sehen Sie sich nun den unten angegebenen Codeausschnitt an, der die ArrayList über den besprochenen Ansatz synchronisiert:

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
public class Synchronizedlist {
public static void main (String[] args){
  CopyOnWriteArrayList<String> x = new CopyOnWriteArrayList<String>();
  x.add("Java");
  x.add("Programming");
  x.add("Language");
  Iterator<String> y = x.iterator();
  while (y.hasNext())
  System.out.println(y.next());
}}

In diesen Codezeilen:

  • Ein … kreieren „CopyOnWriteArrayList”-Objekt vom Typ „String“, das eine threadsichere ArrayList erstellt.
  • Fügen Sie anschließend die angegebenen Zeichenfolgenwerte über die Schaltfläche „ hinzu.hinzufügen()“ Methode.
  • Nun iterieren Sie auf ähnliche Weise die ArrayList mit den Iterator-Methoden.

Ausgabe

„CopyOnWriteArrayList“-Konstruktoren

Im Folgenden sind die anderen Konstrukteure von „CopyOnWriteArrayList”:

CopyOnWriteArrayList(Collection c): Es erstellt eine Liste mit den Elementen der Zielsammlung in der Reihenfolge, in der sie vom Iterator der Sammlung abgerufen werden.

CopyOnWriteArrayList(E[] toCopyIn): Dieser Konstruktor erstellt eine Liste, die eine Kopie des bereitgestellten Arrays enthält.

Ändern von „CopyOnWriteArrayList“ über die Methode des Iterators

Dieser Ansatz gibt das „UnsupportedOperationException” Einschränkung, wenn die Änderung an „CopyOnWriteArrayList“ über die eigene Methode des Iterators erfolgt, d. h. add(), set(), wie unten gezeigt:

Bei der Analyse wird die besprochene Ausnahme ausgelöst.

Der Iterator gibt jedoch nicht das „ConcurrentModificationExceptionAuch wenn „copyOnWriteArrayList“ während der Iteration geändert wird, wird dies wie folgt demonstriert:

Abschluss

Eine ArrayList in Java kann mit „Collections.synchronizedList()”-Methode oder über „CopyOnWriteArrayList“. Der erstere Ansatz wirft das „ConcurrentModificationException” während der Iteration, während dies im letzteren Ansatz nicht der Fall ist. In diesem Artikel wurden die Verfahren zum Synchronisieren der Java ArrayList demonstriert.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen