Вопрос проверяет понимание механизмов синхронизации в Java и области действия блокировок.
Синхронизация на объекте блокирует доступ только к конкретному экземпляру. Синхронизация на классе блокирует доступ ко всем экземплярам этого класса. В первом случае разные объекты могут выполняться параллельно. Во втором — все потоки конкурируют за один общий lock. Выбор влияет на уровень параллелизма и производительность.
В Java синхронизация всегда привязана к монитору, а монитор принадлежит либо объекту, либо классу.
Синхронизация на объекте означает блокировку конкретного экземпляра.
Пример:
synchronized (this) {
// критическая секция
}
Особенности:
каждый объект имеет собственный monitor
разные экземпляры не блокируют друг друга
более высокий уровень параллелизма
Используется, когда:
данные принадлежат конкретному объекту
нет необходимости глобальной блокировки
Синхронизация на классе блокирует один monitor на весь класс.
Пример:
synchronized (MyClass.class) {
// критическая секция
}
Эквивалент:
public static synchronized void method() { }
Особенности:
блокируются все экземпляры класса
используется один общий lock
ниже параллелизм, выше безопасность
Важно понимать:
объектный lock → уровень экземпляра
классовый lock → уровень всего класса
static synchronized всегда работает через lock класса
Неправильный выбор:
снижает производительность
может привести к contention
усложняет масштабирование
Вывод: синхронизация на объекте — локальная, на классе — глобальная, и выбор должен соответствовать области защищаемых данных.