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

На каких объектах не следует синхронизироваться?

MiddleМногопоточность
Коротко

Не синхронизироваться на разделяемых или подменяемых объектах: строковых литералах (интернированы), Integer и других обёртках (кэш значений), публичном this, изменяемом поле. Правильно — private final Object lock.

  • Посторонний код может случайно взять тот же монитор — загадочный deadlock
  • Переприсвоенное поле — потоки синхронизируются на разных объектах
  • Value-based классы (Integer, Optional, LocalDate) — предупреждение компилятора

А ещё Монитор на виртуальных потоках до JDK 24 вызывал pinning

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

Подробно

Опасность в том, что монитор может оказаться общим с совершенно посторонним кодом: строковые литералы интернируются в один экземпляр, а Integer.valueOf возвращает объект из кэша для малых значений — в результате два независимых участка кода блокируют друг друга, и появляется загадочный deadlock. Синхронизация на this проблематична, когда объект публичен: внешний код может захватить тот же монитор и удерживать его сколь угодно долго. Отдельная классическая ошибка — синхронизироваться на изменяемом поле: если ссылку переприсвоить, потоки будут блокировать разные объекты, и защиты не будет вовсе. Отсюда идиома: private final Object lock = new Object() и блокировка на нём.

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

  • Опасные варианты и причины.
  • Приватный final-объект.

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

  • Синхронизироваться на поле, которое может быть переприсвоено.
  • Считать synchronized на публичном методе безопасным по умолчанию.

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

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

Показать варианты и ответ
  • ✓На строковых литералах — они интернированы, и тот же объект может использовать чужой код
  • ✓На объектах-обёртках вроде Integer — из-за кэша значений монитор может оказаться общим
  • ✓На публично доступном this, если экземпляр виден внешнему коду, — тот сможет захватить ваш монитор
  • ✗На приватном final Object, созданном специально для блокировки

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

  • Почему синхронизация на изменяемом поле не работает?
  • Чем блокировка на приватном объекте лучше synchronized-метода?

Разбор темы

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

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

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

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

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