Что указывается в круглых скобках ключевого слова synchronized в Java?

«Что указывается в круглых скобках ключевого слова synchronized в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В круглых скобках после synchronized указывается объект-монитор, на котором происходит синхронизация. Этот объект определяет область кода, которая может быть выполнена только одним потоком одновременно.

Типы объектов-мониторов:

  • this – текущий экземпляр объекта.
  • Произвольный объект – явно созданный объект для синхронизации (предпочтительнее this для лучшего контроля).
  • Класс (Class) – для синхронизации статических методов.

Примеры:

// 1. Синхронизация на произвольном объекте (best practice)
private final Object lock = new Object();

public void threadSafeMethod() {
    synchronized(lock) { // lock - объект-монитор
        // Критическая секция
    }
}

// 2. Синхронизация на текущем экземпляре
public synchronized void instanceMethod() { }
// Эквивалентно:
public void instanceMethod() {
    synchronized(this) { }
}

// 3. Синхронизация на классе для статического метода
public static synchronized void staticMethod() { }
// Эквивалентно:
public static void staticMethod() {
    synchronized(MyClass.class) { }
}

Почему это важно? Выбор объекта-монитора влияет на гранулярность блокировок. Использование отдельного приватного объекта (private final Object) вместо this предотвращает случайные взаимоблокировки, если внешний код также синхронизируется на вашем объекте.