¿AtomicInteger maneja la sincronización?

Aug 17 2020

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

3 Joni Aug 17 2020 at 12:04

¿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.