Что будет выступать монитором, если Synchronized обозначен внутри метода

«Что будет выступать монитором, если Synchronized обозначен внутри метода» — вопрос из категории Многопоточность, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

synchronized внутри метода использует экземпляр объекта (this) в качестве монитора для нестатических методов и класс (Class object) для статических.

Пример:

public class Example {
    // Монитор — this (экземпляр Example)
    public synchronized void nonStaticMethod() { ... }

    // Монитор — Example.class (Class-объект)
    public static synchronized void staticMethod() { ... }
}

Нюансы:

  • Для synchronized блоков можно явно указать монитор:

    synchronized (lockObject) { ... }
  • Использование this может привести к deadlock, если разные потоки блокируют один объект. Лучше использовать отдельные final-объекты для блокировки.