Обрабатывает ли AtomicInteger синхронизацию?

Aug 17 2020

Если два потока увеличивают одинаковое значение int iс использованием i ++ , мы можем получить проблему, поскольку i ++ не является атомарной операцией. Вот почему есть AtomicInteger.increment(), что делает приращение атомарным. Так что, если бы у нас было 1 ядро ​​и 2 потока .increment(), не могло бы быть абсолютно никаких проблем (так как это не может быть приостановлено в середине операции).

Но что, если бы у нас было 2 ядра и 2 потока, и они это вызывали параллельно (в одно и то же время) increment()?

Может ли быть возможность, что они загружают одинаковое значение int i? Это означает, что если бы int iбыло 1 , конечным результатом было бы 2, а не 3 . В этом случае нас не волнует, является ли это атомарной операцией, поскольку они оба принимают одно и то же значение одновременно.

Итог: синхронизация обрабатывается AtomicInteger?

Ответы

3 Joni Aug 17 2020 at 12:04

Может ли быть возможность, что они загружают одинаковое значение int i?

Да, есть, но это сделано за вас.

Этот incrementAndGetметод использует атомарную операцию «сравнить и установить», которая устанавливает увеличенное значение, но только если новое значение еще не было установлено . Если сравнение не incrementAndGetудалось , получает новое значение и пытается снова.

В результате можно безопасно использовать incrementAndGetнесколько потоков.