notify() - was passiert danach genau?

braindoc

Mitglied
Hallo Java-Jünger,

Die notify()-Methode muss wie die wait()-Methode in einem Synchronized Block aufgerufen werden.

notify() weckt dabei einen wartenden Thread auf.

Was mich nun interessiert: Kann nach dem Aufruf von notify() sofort ein wartender Thread in dem kritischen Bereich (synchronized Block) weiter machen? Da nur ein Thread/Prozess in einem solchen Block aktiv sein kann, frage ich mich was mit dem thread passiert der die notify() methode aufgerufen hat?! wird dieser bis zum verlassen des synchronized Blocks weiter ausgeführt (was ja bedeuten würde das der gerade aufgerufene Thread doch wieder warten muss?!) oder wird die Ausführung des Threads unterbrochen und es wird tatsächlich sofort der wartende Thread aufgeweckt und weitergeführt? ???:L

Bei letzterer Version frage ich mich allerdings wann der Code ausgeführt wird der nach dem notify() und vor dem ende des synchronized Blocks liegt? :bahnhof:

Hinweis: Die "erfinder" des Monitor Konzepts haben dabei unterschiedliche vorschläge gehabt (siehe: Moderne Betriebsysteme von Tannenbaum) - aber wie genau wurde es in java umgesetzt?!

bin für jeden Tipp hilfreich, am besten mit Quellenangabe - ich selbst habe bei meiner recherche aber nichts darüber gefunden...

Danke!
 

HoaX

Top Contributor
Scheib dir doch einen Test mit ein paar Sysouts und sleep und du siehst es :)
So adhoc weiß ich es auch nicht, aber ich gehe davon aus, das erst das synchronized von dem Thread verlassen werden muss, welcher notify aufgerufen hat, bevor etwas weiteres passiert.

Edit: Ein kurzer Test sagt: meine Annahme stimmt.
Edit2: Steht auch in der Javadoc von wait(): ...The thread then waits until it can re-obtain ownership of the monitor and resumes execution...
und ebenso bei notify(): ...The awakened thread will not be able to proceed until the current thread relinquishes the lock on this object. ...

Noch Fragen, Kienzle?
 
Zuletzt bearbeitet:

braindoc

Mitglied
oh, wow, erstmal danke dür die prompte und genaue Antwort!
und dann will ich mich auch gleich mal ein bisschen kleinlaut entschuldigen das ich nicht in der javadoc nachgeschaut habe - eigendlich sollte das ja eine der ersten anlaufstellen sein. :oops:

Damit ist meine Frage auch beantwortet.

Es haben sich noch Folgefragen ergeben, die zwar nicht so wichtig sind, aber vieleicht kann mir da ja auch einer weiterhelfen:
- in welchem Zustand befindet sich der Thread wenn er nun durch ein notify() aufgeweckt wurde, aber den kritischen Bereich noch nicht betreten kann da der thread der ihn aufgeweckt hat noch in im kritischen Bereich ist? er ist ja dann nichtmehr im wartezustand, aber auch noch nicht laufend?
- wie erfährt der "wartende" Thread, der ja nun nichtmehr wirklich wartend ist, das der andere den kritischen Bereich verlassen hat?

Gruß
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Naja... beides ist eher "passiv" (in dem Sinne das es KEIN "busy waiting" ist)... was genau meinst du? Das wait() wird zumindest von einem anderen Thread "aktiv" beendet (indem der andere Thread notify aufruft), und beim Warten auf den Monitor wird das warten eher "indirekt" beendet, indem ein anderer Thread den monitor freigibt, aber ... "aktiv" und "passiv".. hm :bahnhof:
 

braindoc

Mitglied
um noch mal aktives und passives warten zu definieren:

Ein Prozeß, der auf das Eintreten einer Bedingung wartet, kann
- immer wieder nachfragen (aktives Warten, polling)
- schlafen, bis er benachrichtigt wird (passives Warten)

... dann währe also auch das Warten nach dem Aufwecken bis zum Betreten des kritischen Bereichs ein "passives" Warten weil der Wartende vom Laufzeitsystem aufgerufen wird wobald der kritische Bereich, bzw der Monitor frei ist?
 

Marco13

Top Contributor
Ja, die Frage ist eher, warum sollte man manuell einen Thread mit wait schlafen legen, wenn der sowieso schon auf den monitor warten würde?

Bei "wait" kann man die Aufwach-Bedingung genauer spezifiieren bzw. überprüfen:
Code:
void waitInOneThread()
{
    synchronized(monitor) { monitor.wait(); }
}

void wakeUpOrNotWakeUp(boolean wakeUp)
{
    synchronized(monitor) { if (wakeUp) monitor.notifyAll(); }
}

Genaugenommen ist das aber immernoch ziemlich "low-level", deswegen wurde java.util.concurrent entwickelt..
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
G Threads Threadprogrammierung wait() und notify() Allgemeine Java-Themen 4
T Wait/Notify() bei Thread Allgemeine Java-Themen 6
B Threads Barrier mit wait()/notify() aber nicht alle Prozesse terminieren Allgemeine Java-Themen 2
P Threads abwechseln lassen mit wait() und notify() Allgemeine Java-Themen 2
M Java Threads - Wait Notify - Verständnisproblem Allgemeine Java-Themen 5
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
K Threads wait() und notify() Allgemeine Java-Themen 8
Q Frage zu Threads ( notify() wait() ) Allgemeine Java-Themen 6
G Thread wait, notify Allgemeine Java-Themen 4
L Producer/Consumer Thread mit notify auf File Allgemeine Java-Themen 5
G notify() was wird verständigt Allgemeine Java-Themen 5
H wait() and notify() mit mehreren Prozessen Allgemeine Java-Themen 14
K synchronized und notify / notifyAll Allgemeine Java-Themen 8
G MVC-Konzept - effizienz beim "notify" Allgemeine Java-Themen 2
A thread1 stoppt thread2 mit wait() und notify() ? Allgemeine Java-Themen 3
M Unterschied notify() und notifyAll() Allgemeine Java-Themen 1
S Unterschied zwischen notify() und notifyAll() Allgemeine Java-Themen 2
jhCDtGVjcZGcfzug Klassen Was genau passiert hier? Kann mir das jemand bitte Zeile für Zeile erklären? Allgemeine Java-Themen 1
R Methoden Was passiert in den markierten Zeilen? Allgemeine Java-Themen 8
S ExecutorService.invokeAll -- was passiert wenn einige Tasks schon ausgefuehrt wurden? Allgemeine Java-Themen 2
F Was Passiert bei einem externen Programmaufruf Allgemeine Java-Themen 4
S was passiert bei diesem filereader prozess Allgemeine Java-Themen 2
M Thread: was passiert nach run()? Allgemeine Java-Themen 12
A Was passiert hier? Allgemeine Java-Themen 13
berserkerdq2 IJVM, ich tue auf meinen Stack 100 und 120 rein, danach subtrahiere ich, macht die Maschine 100-120 oder 120-100? Allgemeine Java-Themen 8
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
J Umwandeln von URL zu File und danach kopieren geht nicht Allgemeine Java-Themen 1
G Mouselistener geht aber danach Fehler bei JOptionPane Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben