Получить доступ

Какие пары действий образуют отношение happens-before?

MiddleJVM и сборка мусора
Коротко

Happens-before — гарантия, что результаты A видны в B. Пары: порядок внутри потока, unlock → последующий lock того же монитора, запись volatile → последующее чтение того же поля, Thread.start() → действия потока, действия потока → успешный join(). Отношение транзитивно.

  • Это не про время, а про видимость и порядок
  • Запись final-полей в конструкторе видна после его завершения (при корректной публикации)
  • Классы java.util.concurrent документируют свои гарантии: put в очередь → take

А ещё Нет цепочки happens-before — нет гарантии, даже если «по времени уже записано»

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Happens-before — не про время, а про гарантию: если A happens-before B, то результаты A видны в B. Базовые правила: порядок операций внутри одного потока; unlock перед последующим lock того же монитора; запись volatile перед последующим чтением; Thread.start() перед всем в потоке; всё в потоке перед возвратом из join(); замораживание final-полей в конце конструктора. Отношение транзитивно — именно это позволяет опубликовать целый граф объектов через одну volatile-ссылку. Обычные чтения без синхронизации никаких гарантий не дают.

Что хотят услышать

  • Определение через видимость.
  • Основные правила.
  • Транзитивность как основа безопасной публикации.

Частые ошибки

  • Понимать happens-before как «выполнилось раньше по времени».
  • Забывать про транзитивность — на ней держится безопасная публикация.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Освобождение монитора и его последующий захват другим потоком
  • ✓Запись в volatile-поле и последующее чтение этого поля
  • ✓Вызов Thread.start() и любое действие внутри запущенного потока
  • ✗Два независимых чтения обычного поля из разных потоков

Что спросят дальше

  • Что гарантирует замораживание final-полей?
  • Почему без happens-before возможна вечная работа цикла с обычным флагом?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем