Ответ
Захват монитора — это получение потоком эксклюзивной блокировки, связанной с конкретным объектом. Это основа работы ключевого слова synchronized.
- Как работает: Каждый объект в Java имеет связанный с ним монитор (внутреннюю блокировку). Когда поток входит в
synchronizedблок (или метод), он захватывает монитор указанного объекта. Другие потоки, пытающиеся захватить монитор того же объекта, будут переведены в состояниеBLOCKEDдо его освобождения. - Почему это важно: Гарантирует взаимное исключение (mutual exclusion) для критической секции кода, предотвращая состояние гонки (race condition).
-
Пример:
public class Counter { private int value = 0; private final Object lock = new Object(); // Объект-монитор public void safeIncrement() { synchronized (lock) { // Поток захватывает монитор объекта 'lock' value++; // Критическая секция защищена } // При выходе из блока монитор автоматически освобождается } } - Ключевые моменты:
- Монитор освобождается при нормальном или исключительном выходе из
synchronizedблока. - Методы
wait(),notify(),notifyAll()классаObjectмогут быть вызваны только изsynchronizedконтекста, так как требуют владения монитором. - Неправильное вложение блокировок может привести к взаимной блокировке (deadlock).
- Монитор освобождается при нормальном или исключительном выходе из