Colecciones sincronizadas e inmutables en Java

Escrito por el .
java planeta-codigo programacion
Comentarios

Java

En la API de Java hay un conjunto amplio de estructuras de datos de diferentes tipos para guardar información de forma eficiente según sea la necesidad de la aplicación. Desde listas de elementos ordenados, conjuntos de elementos no repetidos, estructuras clave-valor, árboles, pilas, colas, … Este conjunto de estructuras se encuentran agrupadas en la API de colecciones. Además de las estructuras de datos se les puede añadir funcionalidades en algunos casos necesarias para hacerlas inmutables de modo que no puedan ser modificadas, y para hacerlas sincronizadas en los casos que varios threads hagan operaciones de consulta y alguno operaciones de escritura de modo que las estructuras no se corrompan, una colección no sincronizada se puede convertir en una sincronizada o también existen colecciones sincronizadas diseñadas específicamente para ser eficientes en las aplicaciones concurrentes.

La interfaz Collection es implementada por varias interfaces y clases ArrayList, HashSet, List, Queue, Set, SortedSet, Stack, TreeSet y algunas otras, por otro lado está la interfaz Map para estructuras clave-valor. Las colecciones que mantienen un orden en sus elementos heredan de la interfaz List que posee métodos con operaciones basadas en un índice como obtener, insertar o eliminar un elemento en una determinada posición. Los Set no permiten elementos que sean iguales según determine el método equals del objeto y los presentes en la colección. Los Map asocian una clave a cada objeto que se utiliza para realizar operaciones en la colección.

Muchos de los métodos de las colecciones funcionan en términos de los métodos equals y hashCode de modo que si en una determinada clase se sobreescriben se ha de hacer implementando el contrato de estos métodos correctamente de otra manera una aplicación puede presentar errores de difícil depuración.

La clase Collections contiene numerosos métodos estáticos entre ellos para hacer una colección que no lo sea en inmutable o sincronizada. Con los métodos synchronizedCollection, synchronizedList, synchronizedMap y synchronizedSet para hacerlas sincronizadas y los métodos unmodifiableCollection, unmodifiableList, unmodifiableMap y unmodifiableSet. Estos métodos estáticos de la clase Collections reciben como parámetro una colección no sincronizada o inmutable y devuelven una colección sincronizada o inmutable.

Las colecciones específicas para la concurrencia son más eficientes que convertir una colección no sincronizada en sincronizada con los métodos de Collections. Las colecciones que se convierten en sincronizadas tienen una contención en toda la colección cuando no es necesario para las operaciones de lectura. Si las operaciones de lectura son mayoría las colecciones específicas para la concurrencia son más eficientes, no tienen tanta contención, por ejemplo, ConcurrentHashMap divide el mapa en varios segmentos y solo bloquea los segmentos relevantes lo que permite a múltiples threads acceder a otros segmentos del mismo mapa sin contención. CopyOnWriteArrayList permite varios lectores sin necesidad de sincronización y cuando ocurre una escritura copia el ArrayList a uno nuevo.