Java Memory Model
Вопрос
Что такое Java Memory Model и зачем она нужна? Расскажите про happens-before на примерах.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Процессоры и JIT кешируют и переставляют операции
JMM определяет, какие записи видны другому потоку
Правила happens-before: монитор, volatile, start, join, транзитивность
Data race: несинхронизированный доступ с записью
final-поля и безопасная публикация
Пример: флаг остановки или DCL
Что могут спросить следом
- Зачем нужны final-поля для неизменяемых объектов?
- Что такое безопасная публикация объекта?
- Как VarHandle связан с JMM?
Разбор
Процессоры имеют кеши и буферы записи, а компилятор и процессор переставляют инструкции ради скорости. В одном потоке это незаметно, а между потоками запись может не стать видимой или стать видимой в другом порядке. JMM задаёт правила, когда видимость гарантирована: отношение happens-before. Основные правила: внутри потока порядок программы, отпускание монитора перед последующим захватом того же монитора, запись volatile перед последующим чтением, start перед кодом потока, код потока перед возвратом из join, и всё это транзитивно. Если доступы к переменной из разных потоков не связаны happens-before и есть запись, это data race. Пример: флаг остановки без volatile, и цикл может не завершиться никогда. Другой пример: DCL без volatile, когда поток видит ссылку на недостроенный объект. Отдельно гарантия для final-полей: после конструктора они видны всем потокам, если this не утёк, на этом держатся неизменяемые объекты.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.