Wenn das Objekt den Objektmonitor beim Aufrufen von Object.wait() nicht besitzt, kann es nicht auf das Objekt zugreifen, um einen Benachrichtigungslistener einzurichten, bis der Monitor freigegeben wird. Stattdessen wird es als Thread behandelt, der versucht, auf eine Methode auf einem synchronisierten Objekt zuzugreifen.
Oder um es anders auszudrücken, gibt es keinen Unterschied zwischen:
public void doStuffOnThisObject()
und das folgende Verfahren:
public void wait()
Beide Methoden werden blockiert, bis das Objekt Monitor freigegeben wird. Dies ist eine Funktion in Java, die verhindert, dass der Status eines Objekts von mehr als einem Thread aktualisiert wird. Es hat einfach unbeabsichtigte Auswirkungen auf die Methode wait().
Vermutlich wird die Methode wait() nicht synchronisiert, da dies Situationen verursachen kann, in denen der Thread mehrere Sperren für das Objekt hat. (Weitere Informationen hierzu finden Sie unter Java Language Specifications/Locking.) Mehrere Sperren sind ein Problem, da die Methode wait() nur eine Sperre rückgängig macht. Wenn die Methode synchronisiert würde, würde dies garantieren, dass nur die Sperre der Methode rückgängig gemacht würde, während immer noch eine mögliche äußere Sperre rückgängig gemacht würde. Dies würde eine Deadlock-Bedingung im Code verursachen.
Um Ihre Frage zu beantworten Thread.sleep(), Thread.sleep() garantiert nicht, dass das, was Bedingung Sie warten erfüllt ist. Mit Object.wait() und Object.notify() kann ein Programmierer die Blockierung manuell implementieren. Die Threads entsperren, sobald eine Benachrichtigung gesendet wird, dass eine Bedingung erfüllt wurde. z.B. Ein Lesevorgang von der Festplatte ist beendet und Daten können vom Thread verarbeitet werden. Thread.sleep() würde erfordern, dass der Programmierer abfragt, ob die Bedingung erfüllt wurde, und dann in den Ruhezustand zurückfallen, wenn dies nicht der Fall ist.
Ich verstehe synchronisiert. Die Frage war, warum muss object.wait() den Monitor besitzen, oder warum kann die Erfassung dieses Monitors nicht innerhalb des Objekts eingekapselt werden.wait() Methode (oder ist das was Thread.sleep() tut? –
Sorry, ich missverstanden. Antwort wurde aktualisiert. Beantwortet das Ihre Frage besser? – 64BitBob
Ja, das macht viel Sinn, obwohl die offene Frage ist immer noch "Warum kann die Wartemethode nicht einfach selbst synchronisiert werden?" –