Repaso
English
Java CoreAvanzadoJV-31

¿Por qué este contador NO es thread-safe aunque el campo sea volatile?

private volatile int count = 0;

void increment() {
    count++;
}

Opciones

  1. volatile solo funciona con referencias a objetos, no con campos int
  2. count++ es leer, sumar y escribir: dos threads pueden leer el mismo valor (Opción correcta)
  3. Un campo int no se puede compartir entre threads
  4. Sí es thread-safe, porque volatile cubre todas las operaciones

Respuesta

Porque count++ es leer, sumar y escribir: dos threads pueden leer el mismo valor y se pierde una actualización

Por qué

volatile garantiza que cada thread vea el último valor escrito. Pero count++ no es un solo paso: (1) leer count, (2) sumar 1, (3) escribirlo de vuelta.

Si dos threads leen 5, ambos escriben 6 y se pierde un incremento (una race condition).

Soluciones: AtomicInteger.incrementAndGet() (atómico y sin locks), hacer el método synchronized, o usar LongAdder si hay muchísima contención.

private final AtomicInteger count = new AtomicInteger();

void increment() {
    count.incrementAndGet();
}

Recuerda

volatile no hace atómicas las operaciones compuestas.

Términos clave

Practica esta pregunta en Repaso