Назад к вопросам
Middle+
102
questionbank

Что такое ключевое слово volatile в Java и как оно используется?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

volatile гарантирует видимость изменений переменной для всех потоков.

  • Гарантия видимости: Когда один поток изменяет volatile переменную, другие потоки гарантированно увидят это изменение. Без volatile изменения могут оставаться в кеше потока, не синхронизируясь с основной памятью.
  • Не атомарность: volatile не гарантирует атомарность операций. Операции типа инкремента (i++) не являются атомарными и могут привести к состоянию гонки даже с volatile.

Используется для:

  • Флагов состояния: Когда один поток устанавливает флаг, чтобы сообщить другим потокам о каком-то состоянии.
  • Одиночных операций записи/чтения: Когда операции с переменной заключаются в однократную запись одним потоком и многократное чтение другими.

Пример использования с флагом:

// Пример использования volatile для флага завершения
public class VolatileExample {
    private volatile boolean terminated = false;

    public void start() {
        new Thread(() -> {
            while (!terminated) {
                // Работа потока
                System.out.println("Поток работает...");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
            System.out.println("Поток завершен.");
        }).start();
    }

    public void stop() {
        terminated = true; // Изменение volatile переменной
    }

    public static void main(String[] args) throws InterruptedException {
        VolatileExample example = new VolatileExample();
        example.start();
        Thread.sleep(500);
        example.stop();
    }
}