Ответ
Ключевое слово volatile гарантирует видимость изменений переменной для всех потоков и запрещает переупорядочивание операций с ней.
Как это работает:
- Видимость: Запись в
volatile-переменную немедленно сбрасывается в основную память, а чтение — всегда происходит из неё, минуя кеш процессора. - Запрет переупорядочивания: Операции с
volatile-переменной не могут быть переставлены компилятором или процессором относительно других операций, что обеспечивает happens-before гарантии.
Важное ограничение: volatile не обеспечивает атомарность составных операций (например, count++).
Пример использования для флага остановки:
public class StoppableTask {
private volatile boolean stopRequested = false;
public void run() {
while (!stopRequested) {
// Выполняем работу
}
}
public void requestStop() {
stopRequested = true; // Изменение будет сразу видно потоку run()
}
}
Типичные сценарии:
- Флаги состояния (запуск/остановка).
- Публикация результатов инициализации (
safe publication).