AtomicInteger gestisce la sincronizzazione?

Aug 17 2020

Se due thread aumentano entrambi allo stesso modo int iusando 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 ifosse 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

3 Joni Aug 17 2020 at 12:04

Potrebbe esserci la possibilità che caricano lo stesso valore di int i?

Sì, c'è, ma è gestito per te.

Il incrementAndGetmetodo 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, incrementAndGetrecupera il nuovo valore e riprova.

L'effetto netto è che è sicuro da usare incrementAndGetda più thread.