2015-06-05 3 views
5

Рассмотрите несколько потоков, пытающихся получить доступ к критическому разделу, что произойдет с одним потоком, который происходит. Исключение внутри синхронизированного блока, у которого есть wait() и notify() для блокировки и освобождения блокировки ,Что произойдет, если поток выбрасывает исключение внутри синхронизированного блока

+0

Это ответ здесь, http://stackoverflow.com/questions/12521776/what-happens-to-the-lock-when-thread-crashes-inside-a-synchronized-block и http: // stackoverflow.com/questions/2019339/side-effects-of-throwing-an-exception-inside-a-synchronized-clause –

+0

@KennethClark \t Что произойдет, если блокировка не была выпущена вручную. если совершает какие-либо мертвые блокировки –

+0

Блокировка гарантированно будет завершена во всех случаях –

ответ

7

Монитор синхронизации будет выпущен: «Если выполнение тела завершено, как обычно, так и внезапно, действие разблокировки автоматически выполняется на том же мониторе». Спецификация языка Java 17.1. Synchronization.

Другие темы смогут продолжить синхронизацию и вызвать ожидание и уведомление.

Если поток, за исключением которого хранится некоторый ресурс критической программной логики, возможно, вам придется использовать try-finally для обеспечения его освобождения.

0

Как упоминалось в случае возникновения исключения, его необходимо обработать/бросить, чтобы продолжить выполнение, иначе выполнение остановится. Таким образом, в вашем сценарии одинаково, если возникает исключение, тогда оно будет обработано, и дальше блокировка будет выпущена.

+0

что произойдет, если блокировка не была выпущена вручную. если делает какие-либо мертвые блокировки –

+0

Как правило, мы должны позаботиться обо всех сценариях, чтобы избежать возможности блокировки. Если какая-либо мертвая блокировка вызывается, мы ничего не можем сделать с нашей стороны, кроме перезапуска приложения. Чтобы избежать тупиков, я предлагаю вам ознакомиться с «Межканальной связью на Java». –

+0

@ Viswanath D ok ok –

0

Возможно, вы задумываетесь о блокировках так же, как и ресурсы (соединения, ввод-вывод), но в отличие от блокировки ресурсов будут освобождены, как только исполняемый поток достигнет границы выхода критической секции (закрывающая скобка монитора/синхронизированного блока) независимо от того, выбрано ли исключение.

См: synchronized statement

Если выполнение блока завершается преждевременно по какой-либо причине, то монитор разблокирован и синхронизированный оператор завершается преждевременно по той же причине.

+0

, тогда эта блокировка будет автоматически отпущена –

+0

Да, в случае исключения монитор разблокируется, и инструкция 'synchronized' завершается внезапно, освобождая блокировку (монитор) –

Смежные вопросы