1 Tipos de Colecciones Thread-Safe¶
Tipos de Colecciones Thread-safe¶
Cuando desarrollamos programas multihilo debemos ser muy ciudadosos con el uso de las colecciones de datos, ya que la mayoría de las estas clases no están preparadas para trabajar con aplicaciones concurrentes, ya que no controlan automáticamente el acceso concurrente a sus datos. Si distintas tareas concurrentes comparten una estructura de datos y no se implementan estrategias de acceso concurrente, pueden producirse errores de inconsistencia de datos que afectarán a correctitud de nuestro programa.
Por defecto, las colecciones habituales de Java, como ArrayList
o HashMap
no están sincronizadas, lo que implica que no es seguro usarlas desde distintos hilos de ejecución (no son thread-safe). Por ejemplo, si varios hilos llaman a métodos que varían la estructura de una ArrayList
, como add()
o remove()
pueden producirse condiciones de carrera que generen errores en la estructura de la colección.
Con las distintas versiones de Java han ido apareciendo distintas formas de conseguir estructuras de datos thread-safe, cada una de ellas con sus ventajas e inconvenientes:
- Unmodifiable collections: Colecciones inmodificables que envuelven una colección mutable.
- Copy on write collections: Colecciones creadas a partir de una colección mutable, que cada vez que son modificadas crean una nueva versión de la colección.
- Inmutable collections: Colecciones inmodificables creadas a partir de los elementos de una colección, pero que no la envuelven.
- Synchronized collections: Colecciones que envuelven otra colección para proporcionar un acceso sincronizado a través de un objeto cerrojo asociado. Son thread-safe, pero no proporcionan un rendimiento óptimo en casos de concurrencia intensiva.
- Concurrent-aware collections: Colecciones que no solamente son thread-safe, sino que además están especialmente diseñadas para que el acceso concurrente sea lo más óptimo posible en relación a su rendimiento. Existen dos subtipos: las que usan cerrojos y proporcionan un modo bloqueante, y las que no usan cerrojos, sino operaciones CAS (lock-free).