¿Por qué este contador NO es thread-safe aunque el campo sea volatile?
private volatile int count = 0;
void increment() {
count++;
}Opciones
volatilesolo funciona con referencias a objetos, no con camposintcount++es leer, sumar y escribir: dos threads pueden leer el mismo valor (Opción correcta)- Un campo
intno se puede compartir entre threads - Sí es thread-safe, porque
volatilecubre 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.