AtomicInteger gère-t-il la synchronisation?

Aug 17 2020

Si deux threads s'incrémentent tous les deux de la même manière en int iutilisant i ++ , nous pourrions avoir un problème, car i ++ n'est pas une opération atomique. C'est pourquoi il y en a AtomicInteger.increment(), ce qui rend l'incrémentation atomique. Donc, si nous avions 1 core et 2 threads en cours .increment(), il ne pourrait y avoir absolument aucun problème (car il ne peut pas être suspendu au milieu de l'opération).

Mais que se passerait-il si nous avions 2 cœurs et 2 threads et qu'ils appellent cela en parallèle (exactement au même moment) increment()?

Serait-il possible qu'ils chargent la même valeur de int i? Cela signifie que si int iétait 1 , le résultat final serait 2 et non 3 . Dans ce cas, nous ne nous soucions pas de savoir s'il s'agit d'une opération atomique car ils ont tous deux pris la même valeur en même temps.

Conclusion: la synchronisation est-elle gérée par AtomicInteger?

Réponses

3 Joni Aug 17 2020 at 12:04

Serait-il possible qu'ils chargent la même valeur de int i?

Oui, il y en a, mais c'est géré pour vous.

La incrementAndGetméthode utilise une opération atomique "comparer et définir" qui définit la valeur incrémentée, mais uniquement si une nouvelle valeur n'a pas déjà été définie . Si la comparaison échoue, incrementAndGetrécupère la nouvelle valeur et réessaye.

L'effet net est qu'il est sûr de l'utiliser à incrementAndGetpartir de plusieurs threads.