synchronized на двух методах одного объекта — будут ли работать параллельно?

Ответ

Нет. Оба используют один монитор — this. Пока один поток в methodA(), другой не может войти в methodB(). Решение: synchronized(privateLockA) и synchronized(privateLockB) — разные мониторы.

Разбор: Оба synchronized-метода одного объекта используют один и тот же монитор this, поэтому, пока поток держит его в methodA(), вход в methodB() заблокирован — параллельности нет. Решение — синхронизировать по разным приватным объектам-локам внутри того же объекта (никакой второй объект-носитель не нужен). Lock elision применяется только когда escape-анализ доказал, что объект не виден другим потокам, и к этому случаю не относится.

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

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