Czy AtomicInteger obsługuje synchronizację?

Aug 17 2020

Jeśli dwa wątki zwiększają się tak samo int iza pomocą i ++ , możemy mieć problem, ponieważ i ++ nie jest operacją atomową. Dlatego istnieje AtomicInteger.increment(), co sprawia, że ​​inkrementacja jest atomowa. Więc gdybyśmy mieli 1 rdzeń i 2 wątki .increment(), nie byłoby absolutnie żadnego problemu (ponieważ nie można go zawiesić w środku operacji).

Ale co by było, gdybyśmy mieli 2 rdzenie i 2 wątki, a one równolegle (dokładnie w tym samym czasie) to nazywają increment()?

Czy może istnieć możliwość, że ładują tę samą wartość int i? Oznacza to, że jeśli int ibyło 1 , wynik końcowy byłby 2, a nie 3 . W takim przypadku nie obchodzi nas, czy jest to operacja atomowa, ponieważ obie miały tę samą wartość w tym samym czasie.

Konkluzja: czy synchronizacja jest obsługiwana przez AtomicInteger?

Odpowiedzi

3 Joni Aug 17 2020 at 12:04

Czy może istnieć możliwość, że ładują tę samą wartość int i?

Tak, jest, ale załatwiliśmy to za Ciebie.

incrementAndGetMetoda wykorzystuje atomową „Porównaj i ustaw” operację, która ustawia wartość inkrementowany ale tylko wtedy, gdy nowa wartość nie była już ustawiona . Jeśli porównanie nie powiedzie się, incrementAndGetpobiera nową wartość i próbuje ponownie.

Efekt netto jest taki, że można go bezpiecznie używać incrementAndGetz wielu wątków.