AtomicInteger gère-t-il la synchronisation?
Si deux threads s'incrémentent tous les deux de la même manière en int i
utilisant 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
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 incrementAndGet
mé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, incrementAndGet
récupère la nouvelle valeur et réessaye.
L'effet net est qu'il est sûr de l'utiliser à incrementAndGet
partir de plusieurs threads.