Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

volatile

Помечает поле, изменения которого сразу видны всем потокам.

Доступно с: Java 1.0

Синтаксис

private volatile boolean running = true;

Примеры

Флаг остановки рабочего потока:

class Worker implements Runnable {
    private volatile boolean running = true;
 
    public void run() {
        long ticks = 0;
        while (running) {
            ticks++;
        }
        IO.println("worker stopped");
    }
 
    void stop() {
        running = false;
    }
}
 
void main() throws InterruptedException {
    var worker = new Worker();
    Thread t = new Thread(worker);
    t.start();
    Thread.sleep(100);
    worker.stop();
    t.join();
    IO.println("main finished");
}

Результат:

worker stopped
main finished

Примечания

Без volatile поток может никогда не увидеть новое значение running и крутиться вечно. volatile гарантирует видимость, но не атомарность: count++ для volatile-поля по-прежнему теряет обновления — для этого нужны AtomicInteger или synchronized.

См. также

  • synchronized — Разрешает выполнять блок кода только одному потоку за раз.
  • AtomicInteger — Целое число, которое можно безопасно менять из нескольких потоков без блокировок.

В учебнике

  • Синхронизация — Гонка данных в Java и как её избежать — synchronized-методы и блоки, атомарные классы AtomicInteger, ReentrantLock и общий объект блокировки.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.