Si l'objet n'est pas propriétaire de l'objet à surveiller lors de l'appel de l'Objet.wait(), il ne sera pas en mesure d'accéder à l'objet de l'installation d'une aviser l'auditeur jusqu'à ce que le moniteur est libéré. Au lieu de cela, il sera traité comme un thread tente d'accéder à une méthode sur un objet synchronisé.
Ou pour le dire d'une autre façon, il n'y a pas de différence entre:
public void doStuffOnThisObject()
et la méthode suivante:
public void wait()
Les deux méthodes seront bloqués jusqu'à ce que l'objet moniteur est libéré. C'est une fonction en Java pour empêcher l'état d'un objet à partir de la mise à jour de plus d'un thread. Simplement, il a des conséquences inattendues sur le wait() de la méthode.
Sans doute, l'attente() la méthode n'est pas synchronisé car cela pourrait créer des situations où le Fil a plusieurs verrous sur l'objet. (Voir les Spécifications du Langage Java/Verrouillage pour plus d'info sur ce sujet). Plusieurs verrous sont un problème parce que le wait() méthode ne pourra annuler un verrouillage. Si la méthode ont été synchronisés, ce qui permettrait de garantir que seule la méthode de verrouillage serait annulé, tout en laissant un potentiel externe verrouillage annulée. Cela permettrait de créer une situation de blocage dans le code.
Pour répondre à votre question sur le Thread.sleep(), le Thread.sleep() ne garantit pas que ce que vous êtes en attente sur a été rencontré. À L'Aide De L'Objet.wait() et de l'Objet.notify() permet à un programmeur de mettre en œuvre manuellement le blocage. Le fils va débloquer une fois qu'une notification est envoyée qu'une condition a été remplie. par exemple, Une lecture à partir du disque est terminée et les données peuvent être traitées par le thread. Fil de discussion.sleep (), il faudrait programmeur pour interroger si la condition a été remplie, puis tomber sur le dos pour dormir si elle n'a pas.