java: wait (), notify () und synchronisierte Blöcke

8

Ich habe gelernt, dass das Aufrufen der wait() -Methode eines Objekts den Objektmonitor, falls vorhanden, freigibt.

Aber ich habe einige Fragen bezüglich des Aufrufs von notify() für dieses Objekt durch einen anderen Thread:

  1. (wann) wird der wartende Thread aufwachen, wenn in der Zwischenzeit ein anderer (ein dritter) Thread den Objektmonitor besitzt?

  2. wird der wartende Thread aufwachen, wenn ein dritter Thread wait() für dieses Objekt aufgerufen hat?

  3. kann festgestellt werden, ob ein Thread auf die Benachrichtigung eines bestimmten Objekts wartet (java 1.4 / java 5)

  4. Was passiert, wenn wait() in der Methode finalize() aufgerufen wird?

MRalwasser 06.07.2010, 21:57
quelle

4 Antworten

2
  1. notify wird einen auf dem Monitor wartenden Thread aufwecken. Solange und solange der Monitor nicht verwendet wird, kann kein Thread warten. wait () muss in einem synchronisierten Block aufgerufen werden und so muss die Sperre gehalten werden, um den Block weiter auszuführen.
  2. Keine Garantien. Rufen Sie notifyAll auf, um allen Threads eine Chance zum Erwachen zu geben.
  3. Weiß nicht. Du könntest den Thread eine Variable setzen lassen, die sagt, dass er wartet, bevor er schlafen geht ...
  4. Das ist wahrscheinlich eine schlechte Idee. Können Sie sich eine Situation vorstellen, in der dies notwendig ist?
Borealid 06.07.2010, 22:11
quelle
3

Wenn Sie wait () von einem Thread aufrufen, wird dieser Thread nicht mehr ausgeführt und zum waitset des Objekts hinzugefügt. Wenn Sie notify () von einem anderen Thread aufrufen, wird ein zufälliger Thread aus dem Wartezustand aktiviert. Wenn Sie notifyAll () aufrufen, sind alle zur Ausführung bereit.

Wenn Sie notify () aufrufen, ist der Thread bereit zu laufen, aber es bedeutet nicht, dass er sofort ausgeführt wird, seien Sie also vorsichtig.

  1. Es würde nach dem Zufallsprinzip einen Thread aus dem Waitset aufwecken.

  2. Du weißt nicht, welcher zuerst erwacht wird, es folgt keiner Reihenfolge.

  3. Thread.getState ()

  4. Sie würden Deadlock erzeugen.

sui 06.07.2010 22:14
quelle
2
  1. Deshalb haben Sie die Methoden notify() und notifyAll() . Ersterer weckt einen Thread, der auf das Objekt wartet, letzterer weckt alle Threads auf. Ein wartender Thread wird nicht aktiviert, wenn wait() in einem anderen Thread aufgerufen wird.

  2. Nein.

  3. Es ist nur möglich, thread.holdsLock(obj) aufzurufen, um zu sehen, ob ein Thread die Monitorsperre für ein bestimmtes Objekt enthält.

  4. Rufen Sie wait() nicht in einer Finalize-Methode auf.

Chris Dennett 06.07.2010 22:10
quelle
0

2: Nicht unbedingt. notify() wacht eins der wartenden Threads auf. Es könnte der ursprüngliche oder der dritte sein.

3: Mit thread.getState() können Sie herausfinden, ob ein Thread auf ein Objekt wartet, aber ich weiß nicht, ob Sie immer genau herausfinden können, um welches Objekt es sich handelt.

    
Martijn 06.07.2010 22:10
quelle

Tags und Links