Ответ вслух Middle Потоки и Java Memory Model спрашивают часто обновлено

synchronized и volatile

Вопрос

Чем synchronized отличается от volatile? Когда что использовать?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

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

Что должно прозвучать в ответе

  • synchronized: взаимное исключение плюс видимость

  • volatile: только видимость и порядок, без атомарности составных операций

  • volatile для флагов и однократной публикации

  • synchronized для инвариантов из нескольких полей и read-modify-write

  • Атомики как средний вариант (CAS)

  • Цена: блокировка и конкуренция против дешёвого чтения

Что могут спросить следом

  • Что такое реентерабельность монитора?
  • Как работает CAS?

Разбор

synchronized даёт две вещи: только один поток выполняет блок на данном мониторе, и всё, что записано до выхода из блока, видно следующему, кто войдёт. volatile даёт только видимость и упорядочивание, без взаимного исключения. Поэтому volatile подходит для флага остановки или для публикации ссылки на уже готовый неизменяемый объект. Если операция составная, например count++ или проверка и изменение двух связанных полей, нужен synchronized или Lock. Для одиночных счётчиков и ссылок есть атомики на CAS: AtomicInteger, AtomicReference, а при высокой конкуренции за счётчик LongAdder. Монитор реентерабелен, поэтому synchronized метод может вызвать другой synchronized метод того же объекта.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме