En Java, el trabajo con hilos se implementa a través de las clases Thread, Runnable y del paquete java.util.concurrent. Para organizar la seguridad de los hilos, se utilizan varios mecanismos de sincronización:
synchronized) permiten que varios hilos accedan a datos compartidos sin condiciones de carrera.ReentrantLock, Semaphore, AtomicInteger, ConcurrentHashMap) ofrecen formas más flexibles de sincronización.Ejemplo de sincronización:
public class Counter { private int count = 0; public synchronized void increment() { count++; } public int getCount() { return count; } }
Ejemplo utilizando clases atómicas:
import java.util.concurrent.atomic.AtomicInteger; public class AtomicCounter { private AtomicInteger count = new AtomicInteger(0); public void increment() { count.incrementAndGet(); } public int getCount() { return count.get(); } }
¿Garantiza la palabra clave volatile la seguridad de los hilos al incrementar un contador de tipo int?
Respuesta: No. volatile solo asegura la visibilidad del valor entre hilos, pero no la atomicidad de las operaciones. El incremento no es una operación atómica (count++ consiste en leer, aumentar y escribir), por lo que pueden ocurrir pérdidas de datos. Para un incremento seguro en hilos se necesita sincronización o clases como AtomicInteger.
volatile int count = 0; // count++ ¡no es seguro para hilos!
Historia
En una tienda en línea, el saldo de bonificación se actualizaba a través de un contador volatile. Bajo la carga de miles de usuarios pidiendo productos, parte de las bonificaciones se perdieron debido a la carrera entre hilos en count++.
Historia
Un empleado utilizó un ArrayList común como un búfer compartido entre un productor y un consumidor en una aplicación multihilo, lo que resultó en ConcurrentModificationException. La solución fue usar bloques synchronized o reemplazarlo por CopyOnWriteArrayList.
Historia
En el procesamiento de pagos, un desarrollador realizaba la operación "verificar y retirar montos" a través de dos métodos no relacionados. En condiciones de alta carga, esto llevaba a doble cobro, hasta que se implementaron transacciones atómicas y bloqueos.