Загружаем изображение…
AtomicInteger vs volatile — в чём разница?

В предыдущем посте мы разобрали synchronized и AtomicInteger. Давайте разберёмся, чем AtomicInteger отличается от volatile.

volatile гарантирует, что изменения переменной будут видны другим потокам.

Например:

volatile boolean running = true;

Если один поток изменит running на false, другие потоки увидят это изменение.

Но volatile не гарантирует атомарность операций.

volatile int counter = 0;

counter++;

Операция counter++ состоит из чтения, увеличения и записи. Несколько потоков могут одновременно изменить значение и потерять часть обновлений.

Для таких случаев подходит AtomicInteger:

AtomicInteger counter = new AtomicInteger(0);

counter.incrementAndGet();

Метод incrementAndGet() атомарно увеличивает значение на единицу.

Также доступны другие операции:

counter.get(); // получить значение
counter.set(10); // установить значение
counter.addAndGet(5); // увеличить на 5
counter.compareAndSet(10, 20); // изменить, если текущее значение

равно 10

Главная идея:

volatile обеспечивает видимость изменений, а AtomicInteger позволяет безопасно выполнять атомарные операции над числом без явной блокировки.
Просмотры: 20
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти