synchronized и volatile
Вопрос
Чем synchronized отличается от volatile? Когда что использовать?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
synchronized: взаимное исключение плюс видимость
volatile: только видимость и порядок, без атомарности составных операций
volatile для флагов и однократной публикации
synchronized для инвариантов из нескольких полей и read-modify-write
Атомики как средний вариант (CAS)
Цена: блокировка и конкуренция против дешёвого чтения
Что могут спросить следом
- Что такое реентерабельность монитора?
- Как работает CAS?
Разбор
synchronized даёт две вещи: только один поток выполняет блок на данном мониторе, и всё, что записано до выхода из блока, видно следующему, кто войдёт. volatile даёт только видимость и упорядочивание, без взаимного исключения. Поэтому volatile подходит для флага остановки или для публикации ссылки на уже готовый неизменяемый объект. Если операция составная, например count++ или проверка и изменение двух связанных полей, нужен synchronized или Lock. Для одиночных счётчиков и ссылок есть атомики на CAS: AtomicInteger, AtomicReference, а при высокой конкуренции за счётчик LongAdder. Монитор реентерабелен, поэтому synchronized метод может вызвать другой synchronized метод того же объекта.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.