Synchroniser l'accès à une ArrayList en Java

On a expliquer précédemment le principe de la synchronisation quand on a parlé de la différence entre Vector et ArrayList. ArrayList n'est pas synchronisée et ne doit jamais être utilisée dans un environnement multi-thread sans une synchronisation.

Il existe deux façons pour faire la synchronisation:
  1. Utiliser la méthode Collections.synchronizedList()
  2. Utiliser une version protégée de ArrayList: CopyOnWriteArrayList

1) synchroniser ArrayList avec la méthode Collections.synchronizedList()

Un point important à noter ici est que iterator doit être à l'intérieur du block synchronized comme le montre l'exemple ci-dessous:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class ArrayListSynchronized{

public static void main(String[] args) {

// Créer un ArrayList<String> synchronisée
List<String> slist = Collections.synchronizedList(new ArrayList<String>());

//ajouter des éléments à ArrayList
slist.add("1");
slist.add("5");
slist.add("2");
slist.add("7");

System.out.println("parcourir la liste synchronisée:");
synchronized(slist) {
Iterator<String> iterator = slist.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
}
Exécution:

parcourir la liste synchronisée:
1
5
2
7

2) En utilisant CopyOnWriteArrayList

import java.util.Iterator;

public class CopyOnWriteArrayList{

public static void main(String[] args) {

java.util.concurrent.CopyOnWriteArrayList<String> al =
new java.util.concurrent.CopyOnWriteArrayList<String>();

//ajouter des éléments à ArrayList
al.add("cahier");
al.add("trousse");
al.add("clé usb");
al.add("calculatrice");

System.out.println("parcourir la liste synchronisée:");
Iterator<String> iterator = al.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
Exécution:

parcourir la liste synchronisée:
cahier
trousse
clé usb
calculatrice