Вопрос проверяет понимание внутреннего механизма synchronized и того, как именно Java координирует доступ потоков к общим данным.
Синхронизация на мониторе объекта означает, что потоки конкурируют за внутренний монитор конкретного объекта. Только один поток может владеть монитором в каждый момент времени. Пока монитор захвачен, другие потоки вынуждены ждать. Это обеспечивает взаимное исключение и корректную видимость изменений.
Монитор объекта — это внутренний механизм JVM, связанный с каждым объектом, который используется для синхронизации потоков.
Когда используется synchronized, JVM:
привязывает блок или метод к монитору
разрешает доступ только одному потоку одновременно
synchronized (lock) {
// критическая секция
}
Здесь:
lock — объект, чей монитор используется
поток должен захватить монитор lock, чтобы войти в блок
Первый поток захватывает монитор объекта
Все остальные потоки блокируются
После выхода из блока монитор освобождается
Синхронизация привязана к конкретному объекту, а не к коду.
Object a = new Object();
Object b = new Object();
synchronized (a) { } // один монитор
synchronized (b) { } // другой монитор
Эти блоки не блокируют друг друга.
Синхронизация на мониторе объекта — это базовый механизм Java для взаимного исключения, основанный на владении монитором конкретного объекта.