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

Commentaires (0)

Connectez-vous pour commenter

Rejoignez la discussion et partagez vos connaissances avec la communauté

Chargement des commentaires...