Synchronisieren des Zugriffs auf eine ArrayList in Java
Wir haben das Prinzip der Synchronisation bereits erläutert, als wir über den Unterschied zwischen Vector und ArrayList gesprochen haben. ArrayList ist nicht synchronisiert und sollte niemals in einer Multithread-Umgebung ohne Synchronisation verwendet werden.Es gibt zwei Möglichkeiten zur Synchronisierung:
- Verwenden Sie die Methode Collections.synchronizedList()
- Verwenden Sie eine geschützte Version von ArrayListe: CopyOnWriteArrayList
1) synchronisieren ArrayList mit der Collections.synchronizedList()
Ein wichtiger Punkt, der hier zu beachten ist, ist, dass sich der Iterator innerhalb des synchronisierten Blocks befinden muss, wie im folgenden Beispiel gezeigt:
import java.util.ArrayList;Laufzeit:
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class ArrayListSynchronized{
public static void main(String[] args) {
// Erstellen einer ArrayList< String> synchronized
Liste< String> slist = Collections.synchronizedList(new ArrayList< String> ());
//Elemente zu ArrayList hinzufügen
slist.add("1");
slist.add("5");
slist.add("2");
slist.add("7");
System.out.println("Synchronisierte Liste durchsuchen:");
synchronized(slist) {
Iterator< String> iterator = slist.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
}
browse synchronized list:
1
5
2
7
2) Verwenden von CopyOnWriteArrayList
import java.util.Iterator;Run:
public class CopyOnWriteArrayList{
public static void main(String[] args) {
java.util.concurrent.CopyOnWriteArrayList< String> al =
new java.util.concurrent.CopyOnWriteArrayList< String> ();
//Elemente zu ArrayList hinzufügen
al.add("notebook");
al.add("kit");
al.add("USB-Stick");
al.add("calculator");
System.out.println("Synchronisierte Liste durchsuchen:");
Iterator< String> iterator = al.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
browse synchronized list:
notebook
kit
USB stick
calculator