Какие пары действий образуют отношение happens-before?
Happens-before — гарантия, что результаты A видны в B. Пары: порядок внутри потока, unlock → последующий lock того же монитора, запись volatile → последующее чтение того же поля, Thread.start() → действия потока, действия потока → успешный join(). Отношение транзитивно.
- Это не про время, а про видимость и порядок
- Запись final-полей в конструкторе видна после его завершения (при корректной публикации)
- Классы java.util.concurrent документируют свои гарантии: put в очередь → take
А ещё Нет цепочки happens-before — нет гарантии, даже если «по времени уже записано»
Подробно
Happens-before — не про время, а про гарантию: если A happens-before B, то результаты A видны в B. Базовые правила: порядок операций внутри одного потока; unlock перед последующим lock того же монитора; запись volatile перед последующим чтением; Thread.start() перед всем в потоке; всё в потоке перед возвратом из join(); замораживание final-полей в конце конструктора. Отношение транзитивно — именно это позволяет опубликовать целый граф объектов через одну volatile-ссылку. Обычные чтения без синхронизации никаких гарантий не дают.
Что хотят услышать
- Определение через видимость.
- Основные правила.
- Транзитивность как основа безопасной публикации.
Частые ошибки
- Понимать happens-before как «выполнилось раньше по времени».
- Забывать про транзитивность — на ней держится безопасная публикация.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Освобождение монитора и его последующий захват другим потоком
- ✓Запись в volatile-поле и последующее чтение этого поля
- ✓Вызов Thread.start() и любое действие внутри запущенного потока
- ✗Два чтения одного обычного (не volatile) поля из разных потоков
Что спросят дальше
- Что гарантирует замораживание final-полей?
- Почему без happens-before возможна вечная работа цикла с обычным флагом?
Разбор темы
- Java Memory Model: happens-before и volatile
Зачем нужна модель памяти, видимость и переупорядочивание, отношение happens-before, семантика volatile и final, гонки данных.
Связанные вопросы
- Что гарантирует ключевое слово volatile для переменной? Middle
- Почему в double-checked locking поле instance обязано быть volatile? Senior
- Один поток в цикле читает обычное поле-флаг, другой его меняет, но цикл не завершается. Почему? Junior
- Почему один поток может не увидеть изменение, сделанное другим? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.