AtomicInteger gestisce la sincronizzazione?
Se due thread aumentano entrambi allo stesso modo int i
usando i ++ , potremmo avere un problema, poiché i ++ non è un'operazione atomica. Ecco perché c'è AtomicInteger.increment()
, il che rende l'incremento atomico. Quindi se avessimo 1 core e 2 thread in esecuzione .increment()
, non ci potrebbero essere assolutamente problemi (poiché non può essere sospeso nel mezzo dell'operazione).
Ma cosa succederebbe se avessimo 2 core e 2 thread e lo chiamassero parallelamente (esattamente allo stesso tempo) increment()
?
Potrebbe esserci la possibilità che caricano lo stesso valore di int i
? Significa che se int i
fosse 1 , il risultato finale sarebbe 2 e non 3 . In quel caso non ci interessa se si tratta di un'operazione atomica in quanto entrambi hanno preso lo stesso valore contemporaneamente ..
In conclusione: la sincronizzazione è gestita da AtomicInteger?
Risposte
Potrebbe esserci la possibilità che caricano lo stesso valore di
int i
?
Sì, c'è, ma è gestito per te.
Il incrementAndGet
metodo utilizza un'operazione atomica "confronta e imposta" che imposta il valore incrementato ma solo se non è già stato impostato un nuovo valore . Se il confronto fallisce, incrementAndGet
recupera il nuovo valore e riprova.
L'effetto netto è che è sicuro da usare incrementAndGet
da più thread.