Ya hablamos un poco sobre la sincronización cuando compartimos el tutorial Vector vs ArrayList. Como sabemos, ArrayList no está sincronizado y no debe usarse en entornos multiproceso sin sincronización explícita. Esta publicación es para discutir cómo sincronizar ArrayList en Java.
Hay dos formas de sincronizar explícitamente:
- Usando el método Collections.synchronizedList ()
- Usando la variante segura para subprocesos de ArrayList: CopyOnWriteArrayList
Ejemplo 1: método Collections.synchronizedList () para la sincronización ArrayList
En este ejemplo estamos usando Collections.synchronizedList () método. El punto importante a tener en cuenta aquí es que el iterador debe estar en el bloque sincronizado en este tipo de sincronización, como se muestra en el ejemplo siguiente.
package beginnersbook.com; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Collections; public class Details { public static void main(String a[]){ List<String> syncal = Collections.synchronizedList(new ArrayList<String>()); //Adding elements to synchronized ArrayList syncal.add("Pen"); syncal.add("NoteBook"); syncal.add("Ink"); System.out.println("Iterating synchronized ArrayList:"); synchronized(syncal) { Iterator<String> iterator = syncal.iterator(); while (iterator.hasNext()) System.out.println(iterator.next()); } } }
Producción:
Iterating synchronized ArrayList: Pen NoteBook Ink
Método 2: usar CopyOnWriteArrayList
CopyOnWriteArrayList es una variante segura para subprocesos de ArrayList
.
package beginnersbook.com; import java.util.concurrent.CopyOnWriteArrayList; import java.util.Iterator; public class Details { public static void main(String a[]){ CopyOnWriteArrayList<String> al = new CopyOnWriteArrayList<String>(); //Adding elements to synchronized ArrayList al.add("Pen"); al.add("NoteBook"); al.add("Ink"); System.out.println("Displaying synchronized ArrayList Elements:"); //Synchronized block is not required in this method Iterator<String> iterator = al.iterator(); while (iterator.hasNext()) System.out.println(iterator.next()); } }
Producción:
Displaying synchronized ArrayList Elements: Pen NoteBook Ink