volatile

volatile гарантирует, что чтение и запись переменной идут из общей памяти, а не из кэша конкретного ядра — каждый поток сразу видит актуальное значение.

private volatile boolean running = true;

void stop() { running = false; }                 // из одного потока
while (running) { /* ... */ }                     // в другом — увидит false

Без volatile поток, выполняющий while (running), может бесконечно читать закэшированное true, даже если другой поток давно поставил false.

Важно: volatile даёт видимость, но не атомарность — volatile int count; count++; всё ещё не потокобезопасен (это по-прежнему read-modify-write). Для атомарных операций нужен synchronized или Atomic*.

🎤 Закрыл тему, если можешь объяснить:
• что гарантирует `volatile` и чем это отличается от атомарности.