2013-07-08 2 views
6

Документация по Java, которую я использую, дает понять, что метод Object.wait() запрашивает связанный монитор перед его возвратом, независимо от того, был ли он уведомлен или является ложным пробуждением; любой возврат нормального метода будет предшествовать повторной регистрации монитора.Возникает ли метод Object.wait(), когда он выдает исключение?

Однако, немного менее понятно, что произойдет в событии Object.wait() выдает исключение, например, Interrupted Exception. Я предполагаю, что он действительно перезагружает блокировку, прежде чем выбросить исключение. Однако, документация не очень четко об этом, так что я не уверен на 100% ...

Вот это documentaiton Я смотрю на: http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#wait%28%29

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

ответ

5

JLS указывает это гораздо более подробно, чем Object#wait Javadoc. Согласно этому тексту, замок должен быть безоговорочно восстановлен. Цитируя соответствующие биты:

  1. Тема т добавляется к набору ожидания объекта м и выполняет п разблокировать действия на м.

  2. Thread т не выполняет каких-либо дальнейших инструкций, пока она не была удалена из м подождем набор. Нить может быть удален из набора задержек из-за какой-либо одной из следующих действий, и будет возобновлена ​​иногда позже:

    • [...]

    • Действие прерывания выполняется на т ,

  3. резьбы т выполняет п блокировки действия на м.

+0

Эмпирически это кажется правильным. Это также разумно. Я не уверен, что это может быть выведено из документации, что указывает на ошибку в документации. –

+0

@PatriciaShanahan Я полностью переписал ответ: JLS на самом деле четко указывает, что замок будет безоговорочно восстановлен. –

+0

@PatriciaShanahan Спасибо, это объясняет это очень четко. Спасибо также за ссылку JLS ... Я буду использовать ее в следующий раз, когда у меня будет аналогичный вопрос, который не рассматриваются в документах API. :) –

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