Вопрос проверяет понимание различий между синхронизацией на уровне объекта и на уровне класса.
Для статических методов synchronized использует монитор объекта класса, а не экземпляра. Это означает, что синхронизация действует на весь класс целиком. Все потоки, вызывающие любой static synchronized метод этого класса, будут блокироваться друг относительно друга. Экземпляры класса при этом роли не играют.
static synchronized метод синхронизируется на мониторе объекта Class, соответствующего данному классу.
class Counter {
static synchronized void increment() {
// критическая секция
}
}
Эквивалентно:
synchronized (Counter.class) {
// критическая секция
}
синхронизация общая для всего класса
не зависит от количества экземпляров
блокирует все static synchronized методы класса
synchronizedsynchronized метод → монитор экземпляра
static synchronized метод → монитор класса
Это два разных монитора.
Статическая и нестатическая синхронизация:
не конфликтуют
не блокируют друг друга
static synchronized защищает общее состояние класса. Он используется, когда данные разделяются между всеми экземплярами.