¿Qué significa atómico?
Atómico es un conjunto de clases variables del paquete java.util.concurrent.atomic, que ayudan a escribir algoritmos sin bloqueos ni esperas con el lenguaje Java. Un algoritmo que sólo requiere hilos parciales para un progreso constante está libre de bloqueos.
En un algoritmo sin espera, todos los hilos progresan continuamente, incluso en caso de fallo o retraso de los hilos. Los algoritmos sin bloqueo y sin espera también se conocen como algoritmos sin bloqueo.
Los algoritmos no bloqueantes se utilizan para programar procesos e hilos a nivel del sistema operativo y de la máquina virtual Java.
Definición de atómico
Todas las clases del paquete java.util.concurrent.atomic tienen el prefijo “atomic” en sus nombres. Hay distintos tipos de variables atómicas disponibles en el paquete java.util.concurrent.atomic, entre ellos:
- AtomicBoolean
- AtomicInteger
- AtomicIntegerArray
- AtomicIntegerFieldUpdater
- AtomicLong
- AtomicLongArray
- Actualizador de campos AtomicLongFieldUpdater
- AtomicReference
En el lenguaje Java, la sincronización coordina el acceso a los campos compartidos por los hilos y sólo permite a los hilos que tienen bloqueos acceder a las variables protegidas por el bloqueo y modificarlas. Las modificaciones de este hilo son visibles para el hilo que le sigue, pero sólo después de que el hilo libere el bloqueo.
Un ejemplo es una situación en la que el subproceso A tiene un bloqueo. A sólo puede acceder y modificar las variables protegidas por este bloqueo. Si el hilo B mantiene este bloqueo después de A, sólo B podrá ver los cambios de A en las variables protegidas por ese bloqueo concreto. El principal problema del bloqueo se produce cuando B intenta adquirir un bloqueo que posee A. En este caso, B se bloquea para esperar hasta que el bloqueo esté disponible. Los algoritmos de no bloqueo resuelven este problema.
El objetivo principal de crear clases atómicas es implementar estructuras de datos no bloqueantes y sus clases de infraestructura relacionadas. Las clases atómicas no sirven para sustituir a java.lang.Integer y clases relacionadas.
La mayoría de las clases del paquete java.util.concurrent utilizan variables atómicas en lugar de sincronización, directa o indirectamente. Las variables atómicas también se utilizan para conseguir un mayor rendimiento, lo que significa un mayor rendimiento del servidor de aplicaciones.