Mediumvolatile

Чем volatile отличается от synchronized?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

volatile — поле читается/пишется напрямую в main memory, не кэшируется. Гарантирует visibility (видимость изменений) и ordering (memory barrier), но НЕ атомарность составных операций.

class Worker {
    private volatile boolean running = true;

    void run() { while (running) { doWork(); } } // видит изменение из другого потока
    void stop() { running = false; }
}

// ПЛОХО: volatile int x; x++ — это read+add+write, гонка
// Нужно: AtomicInteger
  • volatile подходит для простых boolean-флагов;
  • volatile long/double — атомарность чтения/записи 64-bit (без volatile не atomic в JMM);
  • synchronized даёт и visibility, и mutual exclusion;
  • volatile дешевле (нет blocking), запись в volatile happens-before последующее чтение того же volatile.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.