Загружаем изображение…
AtomicInteger vs volatile — в чём разница?
В предыдущем посте мы разобрали synchronized и AtomicInteger. Давайте разберёмся, чем AtomicInteger отличается от volatile.
volatile гарантирует, что изменения переменной будут видны другим потокам.
Например:
Если один поток изменит running на false, другие потоки увидят это изменение.
Но volatile не гарантирует атомарность операций.
Операция counter++ состоит из чтения, увеличения и записи. Несколько потоков могут одновременно изменить значение и потерять часть обновлений.
Для таких случаев подходит AtomicInteger:
Метод incrementAndGet() атомарно увеличивает значение на единицу.
Также доступны другие операции:
равно 10
Главная идея:
volatile обеспечивает видимость изменений, а AtomicInteger позволяет безопасно выполнять атомарные операции над числом без явной блокировки.
В предыдущем посте мы разобрали 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