Ответ
В круглых скобках после 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 предотвращает случайные взаимоблокировки, если внешний код также синхронизируется на вашем объекте.