¿AtomicInteger maneja la sincronización?
Si dos subprocesos se incrementan de la misma manera int iusando 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 ifuera 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 incrementAndGetmé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, incrementAndGetbusca el nuevo valor y vuelve a intentarlo.
El efecto neto es que es seguro usarlo incrementAndGetdesde múltiples hilos.