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