¿AtomicInteger maneja la sincronización?
Si dos subprocesos se incrementan de la misma manera int i
usando i ++ , podríamos tener un problema, ya que i ++ no es una operación atómica. Es por eso que lo hay AtomicInteger.increment()
, lo que hace que el incremento sea atómico. Entonces, si tuviéramos 1 núcleo y 2 subprocesos funcionando .increment()
, no podría haber ningún problema (ya que no se puede suspender en medio de la operación).
Pero, ¿y si tuviéramos 2 núcleos y 2 subprocesos y paralelamente (exactamente al mismo tiempo) lo llaman increment()
?
¿Podría haber posibilidad de que carguen el mismo valor de int i
? Es decir, si int i
fuera 1 , el resultado final sería 2 y no 3 . En ese caso, no nos importa si se trata de una operación atómica, ya que ambos tomaron el mismo valor al mismo tiempo.
En pocas palabras: ¿AtomicInteger se encarga de la sincronización?
Respuestas
¿Podría haber posibilidad de que carguen el mismo valor de
int i
?
Sí, lo hay, pero se maneja por ti.
El incrementAndGet
método utiliza una operación atómica de "comparar y establecer" que establece el valor incrementado, pero solo si aún no se estableció un nuevo valor . Si la comparación falla, incrementAndGet
busca el nuevo valor y vuelve a intentarlo.
El efecto neto es que es seguro usarlo incrementAndGet
desde múltiples hilos.