Вопрос проверяет понимание ключевого слова volatile в Java, которое используется для обеспечения видимости изменений переменной между потоками.
Ключевое слово volatile в Java решает проблему видимости изменений переменной между потоками в многопоточных приложениях. Без него каждый поток может кэшировать значение переменной в локальной памяти (например, в регистрах процессора или кэше), и изменения, сделанные одним потоком, могут быть не видны другому потоку немедленно или вообще.
Когда переменная объявлена как volatile, компилятор и JVM получают следующие гарантии:
Типичные сценарии использования:
boolean running = true).public class WorkerThread extends Thread {
private volatile boolean running = true;
public void run() {
while (running) {
// Выполняем работу
}
}
public void stopGracefully() {
running = false; // Изменение видно другому потоку
}
}Важно помнить, что volatile не обеспечивает атомарность операций. Например, операция инкремента count++ состоит из чтения, изменения и записи. Если два потока одновременно инкрементируют одну volatile-переменную, может произойти потеря обновления. Для таких случаев нужны атомарные классы (например, AtomicInteger) или синхронизация.
Вывод: Используйте volatile для простых переменных состояния, где важна мгновенная видимость изменений между потоками, но операции над ними атомарны по своей природе (например, простая запись). Для составных операций выбирайте другие механизмы синхронизации.