Вопрос проверяет понимание гарантий видимости изменений между потоками.
volatile гарантирует:
Видимость изменений для всех потоков
Запрет переупорядочивания операций
Атомарность чтения/записи (только для примитивов и ссылок)
Проблема без volatile:
class Task {
boolean running = true; // Может быть оптимизировано (кэшировано в CPU)
void work() {
while (running) { /* ... */ } // Бесконечный цикл
}
}Решение:
volatile boolean running = true; // Гарантирует обновление значенияГарантии:
Видимость: Запись в volatile-поле происходит в основную память
Ordering: Операции до записи не переупорядочиваются после нее
Ограничения:
Не заменяет synchronized для составных операций
Не подходит для счетчиков (++ не атомарен)