Если объект не владеет монитором объекта при вызове Object.wait (), он не сможет получить доступ к объекту для настройки прослушивателя уведомлений до тех пор, пока монитор не будет освобожден. Вместо этого он будет рассматриваться как поток, пытающийся получить доступ к методу синхронизированного объекта.
Или, иначе говоря, разницы между:
нет
public void doStuffOnThisObject()
и следующий метод:
public void wait()
Оба метода будут заблокированы до тех пор, пока не будет отпущен монитор объекта. Это функция в Java, которая предотвращает обновление состояния объекта более чем одним потоком. У него просто непредвиденные последствия для метода wait ().
Предположительно, метод wait () не синхронизирован, поскольку это может создать ситуации, когда Thread имеет несколько блокировок на объекте. (См. Спецификации языка Java / Блокировка для получения дополнительной информации об этом.) Многократные блокировки являются проблемой, поскольку метод wait () отменяет только одну блокировку. Если бы метод был синхронизирован, это гарантировало бы, что только блокировка метода будет отменена, но при этом потенциальная внешняя блокировка будет отменена. Это создаст в коде взаимоблокировку.
Чтобы ответить на ваш вопрос о Thread.sleep (), Thread.sleep () не гарантирует, что какое бы условие вы не ожидали, было выполнено. Использование Object.wait () и Object.notify () позволяет программисту вручную реализовать блокировку. Потоки разблокируются после отправки уведомления о том, что условие выполнено. например Чтение с диска завершено, и данные могут быть обработаны потоком. Thread.sleep () потребует от программиста опроса, если условие выполнено, а затем возвратится в спящий режим, если оно не выполнено.