синхронизация Java и обработка исключений - PullRequest
3 голосов
/ 04 декабря 2011

Если у меня есть синхронизированный блок и где-то внутри этого блока выдается исключение, которое не перехватывается в синхронизированном блоке, будет ли снята блокировка, когда исключение распространяется из него? (Синхронизированный блок)

synchronized( mutex )
{
    throw new Exception( "" );
}

Ответы [ 3 ]

5 голосов
/ 04 декабря 2011

Блокировка всегда снимается.

Из JLS §14.19 :

"Если выполнение блока завершается нормально, тогда блокировка разблокирован и синхронизированный оператор завершается нормально. Если выполнение блока завершается внезапно по любой причине, затем Блокировка разблокирована, и оператор синхронизации завершается внезапно по той же причине. "

3 голосов
/ 04 декабря 2011

Да, блокировка снята.

С здесь :

Механизм исключений платформы Java интегрирован с ее моделью синхронизации (§17), так что блокировки освобождаются как синхронизированные операторы (§14.18) и вызовы синхронизированных методов (§8.4.3.6, §15.12) завершаются внезапно.

1 голос
/ 04 декабря 2011

Не должно быть никаких проблем. Блокировка снимается независимо от пути выполнения (возврат, исключение ...). Подробнее см. this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...