Да, собственные блокировки в Java поддерживают повторный вход. Это значит, что поток может безопасно захватить одну и ту же блокировку несколько раз без риска дедлока.
Когда поток захватывает собственную блокировку, которая у него уже есть, блокировка просто увеличивает внутренний счётчик вместо того, чтобы заблокироваться. Каждый захват должен быть сбалансирован с соответствующим освобождением, сохраняя паттерн захвата и освобождения.
Без повторного входа код столкнулся бы со значительными проблемами:
synchronized-методов из других synchronized-методов того же объектаpublic synchronized void outerMethod() {
// Поток держит блокировку здесь
innerMethod(); // Может безопасно перезахватить блокировку
}
public synchronized void innerMethod() {
// Один поток может захватить блокировку снова
}
В этом сценарии поток успешно входит в innerMethod(), даже несмотря на то что уже держит блокировку из outerMethod(). Счётчик блокировки увеличивается при входе и уменьшается при выходе.
Повторный вход — это критически важная особенность собственных блокировок, которая даёт свободу в организации кода. Она позволяет потокам вызывать вложенные synchronized-методы без архитектурных ограничений, делая механизм блокировок Java более практичным и менее подверженным дедлокам в типичных сценариях.
Intrinsic locks в Java используют внутренний счётчик для отслеживания reentrancy, требуя совпадения каждого acquire с соответствующим release для полного разблокирования ресурса.
Новый — ещё не проверен сообществом
Вы