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` и чем это отличается от атомарности.