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 и общий объект блокировки.