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 подскажет развёрнутый ответ в реальном времени.