Как работает synchronized на методе?

Ответ

Для обычного метода блокировка идёт на this (на сам объект). Для static-метода — на Class-объект (ClassName.class). На уровне байткода — это инструкции monitorenter / monitorexit. Если уже владеешь монитором, повторный вход не блокирует: мониторы в Java реентерабельны, поэтому deadlock не возникает.

Разбор: Обычный synchronized-метод блокируется на this, а static — на ClassName.class; ровно наоборот, чем в подмене. Для метода флаг ACC_SYNCHRONIZED ставится в дескрипторе метода, а monitorenter/monitorexit генерируются для synchronized-блока; к тому же мониторы в Java реентерабельны, так что повторный вход своего же потока deadlock не вызывает.

Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.

Заказать гайд Пройти тест
новые гайды и свежие вопросы с собесов — первыми в Telegram Смотреть гайды Подписаться