Многопоточность middle
happens-before: какие пары существуют?
Ответ
volatile write → read. synchronized release → acquire того же монитора. Thread.start() → первая инструкция потока. Последняя инструкция потока → возврат из Thread.join(). final-поля видны после конструктора, если this не утёк наружу.
Разбор: Канонические пары: volatile write→read, release→acquire одного и того же монитора, start()→первая инструкция потока, последняя инструкция→возврат из join(), а также гарантия видимости корректно проинициализированных final-полей при условии, что this не утёк из конструктора. Дистракторы ломают именно эти условия: монитор должен быть тем же; join (а не start) синхронизируется с концом потока; обычные (не volatile) поля без синхронизации не дают happens-before; утечка this отменяет гарантию для final.
Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.