Как работают atomic-и в Java

В этой статье мы разберём, как работают AtomicInteger, AtomicLong и остальные подобные классы из пакета java.util.concurrent.atomic в Java.

Я уже частично описал их работу, здесь же будет более подробное описание, на сколько у меня получится.

На самом деле, в этих классов гораздо больше методов, чем просто get, set и compareAndSet.

Сами эти классы наследуются от java.lang.Number, а значит, они наследуют и реализуют все его методы byteValue, shortValue, intValue, longValue, floatValue, doubleValue. Однако нам интересны не они, а методы, специфичные для атомарных классов вроде AtomicInteger:

Атомарное увеличение значения на delta. Возвращает обновлённое значение.

Сравнивает текущее значение с expect. Если они равны, то сохраняет update и возвращает true. В противном случае возвращает false.

Атомарно уменьшает хранящееся значение на единицу. Возвращает новое значение.

Возвращает текущее хранящееся значение.

Атомарно добавляет delta к текущему значению. Возвращает предыдущее значение.

Атомарно уменьшает хранящееся значение на единицу. Возвращает предыдущее значение.

Атомарно увеличивает хранящееся значение на единицу. Возвращает предыдущее значение.

Атомарно устанавливает новое значение и возвращает старое значение.

Атомарно увеличивает хранящееся значение на единицу и возвращает новое значение.

Устанавливает новое значение спустя какое-то время. Это новое значение может быть невидимо для других потоков какое-то время, они будут считывать старое значение. Метод может быть полезен для оптимизации производительности, так как последующие обращения к значению вполне могут получить старое значение из кэша процессора без обращения к реальному значению в памяти.

Устанавливает новое значение.

Аналогично compareAndSet, но может вернуть false и не обновить значение, даже если хранящееся значение равно expected.

Для AtomicLong методы аналогичны, но принимают и возвращают long вместо int.

Работа методов классов AtomicInteger и AtomicLong основана на специальной команде процессора CAS (compare-and-set), которая сначала сравнивает значение с ожидаемым и лишь потом заменяет его на новое.

Имейте в виду, что у нас нет специальных атомарных классов для byte, short, float и double!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *