Skip to content

5 Synchronized Collections

Synchronized Collections

Hasta ahora hemos visto distintas herramientas que nos proporciona Java para crear colecciones que tengan restringidas las operaciones de modificación de la misma, con objeto de convertirlas en thread-safe.

Sin embargo, hay ocasiones en las que es necesario obligatoriamente poder modificar la colección desde distintos hilos. Para eso casos Java nos proporciona distintas posibilidades.

La primera de ellas en las conocidas como synchronized collection (colecciones sincronizadas), que no son más que wrappers de las principales colecciones a las que se asocia un único objeto monitor para sincronizar las operaciones sobre ella.

Para crear objetos de estas clases wrapper usaremos alguno de los métodos estáticos disponibles para tal fin en la clase Collections, que reciben la colección que se quiere proteger: Collections.synchronizedCollection(collection), Collections.synchronizedList(list), `Collections.synchronizedMap(map) y Collections.synchronizedSet(set).

Sin embargo aunque estas clases wrapper son thread-safe, no están diseñadas ni optimizadas para acceso concurrente, ya que simplemente usan un único objeto monitor (cerrojo intrínseco) para toda la colección.

De hecho, se recomienda que usemos un acceso sincronizado cuando iteremos sobre la colección, o de lo contrario podemos obtener un comportamiento no deseado. Para añadir o eliminar elementos de la colección no es necesario usar un acceso sincronizado.

Veamos un ejemplo:

List<String> synchronizedList = Collections.synchronizedList(new ArrayList<String>());
synchronizedList.add("Alex");
synchronizedList.add("Brian");
synchronized(synchronizedList) {
    Iterator<String> iterator = synchronizedList.iterator(); 
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
}