Вопрос с собеседования · Java

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

MiddleМногопоточность
Коротко

volatile — видимость и порядок для одной переменной без блокировки. synchronized — видимость плюс взаимное исключение: блок целиком выполняется одним потоком, поэтому составные действия становятся атомарными.

  • volatile не блокирует и не защищает инварианты из нескольких полей
  • synchronized — вход и выход из монитора тоже дают happens-before
  • volatile дешевле, synchronized универсальнее

А ещё Проверить-и-изменить (check-then-act) требует synchronized или атомарных классов

Подробно

volatile применяется к полю. Гарантирует, что запись видна остальным потокам и операции не переставляются вокруг неё. Поток не ждёт: обращение стоит чуть дороже обычного, без блокировки.

synchronized применяется к блоку или методу и захватывает монитор объекта. Пока один поток внутри, остальные с тем же монитором ждут в состоянии BLOCKED. Освобождение монитора и последующий захват задают happens-before: всё, что сделал первый поток, видно следующему.

Пример, где volatile не хватает:

volatile int balance;
void withdraw(int x) {
    if (balance >= x) balance -= x;   // два потока пройдут проверку одновременно
}

Каждое отдельное чтение и запись видны, но проверка и изменение не атомарны вместе. Нужен synchronized или CAS-цикл.

Когда что:

  • флаг остановки, публикация неизменяемого объекта — volatile;
  • счётчик — AtomicInteger;
  • несколько связанных полей, check-then-act — synchronized или Lock.

Что хотят услышать

  • Видимость против взаимного исключения.
  • Пример гонки check-then-act.
  • Когда достаточно volatile.

Частые ошибки

  • «volatile делает операции атомарными».

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗volatile делает составные операции атомарными, synchronized — нет
  • ✗Это синонимы
  • ✓volatile даёт только видимость; synchronized — ещё и взаимное исключение
  • ✗volatile даёт и видимость, и атомарность; synchronized нужен только для методов

Что спросят дальше

  • Что такое happens-before?
  • Когда выбрать AtomicInteger?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования