Выбор ответа Middle Потоки и Java Memory Model обновлено

synchronized на статическом и обычном методе

Вопрос

Класс имеет synchronized void a() и static synchronized void b(). Могут ли два потока одновременно выполнять a() на объекте и b()?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Да: a() берёт монитор объекта, а b() монитор объекта Class. Нестатический synchronized метод захватывает монитор this, статический монитор Foo.class.

Варианты ответа

  1. Нет: оба метода синхронизированы по объекту класса Foo.class
  2. Нет: synchronized блокирует сразу все методы класса для других потоков
  3. Только если объект создан в другом потоке, а не в том, что вызывает b()
  4. Да: a() берёт монитор объекта, а b() монитор объекта Classправильный ответ

Разбор

Нестатический synchronized метод захватывает монитор this, статический монитор Foo.class. Это разные объекты, методы не исключают друг друга. Если они трогают общие статические данные, это гонка. synchronized не блокирует «все методы класса», только тех, кто захватывает тот же монитор.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме