O AtomicInteger lida com a sincronização?

Aug 17 2020

Se dois threads incrementarem da mesma forma int iusando i ++ , poderíamos ter um problema, pois i ++ não é uma operação atômica. É por isso que existe AtomicInteger.increment(), o que torna o incremento atômico. Portanto, se tivéssemos 1 núcleo e 2 threads em execução .increment(), não poderia haver absolutamente nenhum problema (já que não pode ser suspenso no meio da operação).

Mas e se tivéssemos 2 núcleos e 2 threads e eles paralelamente (exatamente ao mesmo tempo) chamem isso increment()?

Existe a possibilidade de que carreguem o mesmo valor de int i? Ou seja, se int ifosse 1 , o resultado final seria 2 e não 3 . Nesse caso, não nos importamos se é uma operação atômica, pois ambos assumiram o mesmo valor ao mesmo tempo.

Resumindo: a sincronização é controlada pelo AtomicInteger?

Respostas

3 Joni Aug 17 2020 at 12:04

Existe a possibilidade de que carreguem o mesmo valor de int i?

Sim, existe, mas é feito para você.

O incrementAndGetmétodo usa uma operação atômica de "comparar e definir" que define o valor incrementado, mas apenas se um novo valor ainda não tiver sido definido . Se a comparação falhar, incrementAndGetbusca o novo valor e tenta novamente.

O efeito líquido é que é seguro usar a incrementAndGetpartir de vários threads.