Чем volatile отличается от synchronized?
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?
Разбор темы
- volatile, атомарность и CAS
Разница видимости и атомарности, atomic-классы, compare-and-swap и ABA, контеншн и LongAdder.
- synchronized, мониторы и wait/notify
Взаимное исключение и видимость через монитор, reentrancy, guarded blocks с wait/notify и причины deadlock.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.