Hallo 
Ich hab folgendes Problem. Ich weiß während meines Programmablaufs erst kurz vor einem wait() ob und auf welches (wait-)Objekt wirklich gewartet werden muss.
Das wait-Objekt auf das gewartet werden soll wird während des Programmablaufs abh. von den weiteren existieren wait-Objekten erstellt.
Ob gewartet werden soll ist abhängig von allen anderen wait-Objekten für sämtliche Threads.
Die Bedingung ob gewartet werden muss und das erstellen eines neuen Threads dürfen also nicht gleichzeitig ausgeführt werden. Gleichzeitig muss aber auch das warten auf das Objekt direkt im Anschluss geschehen, sodass sich die Bedingungen nicht direkt vor dem warten ändern kann.
Pseudoprogramm
Die Methode DoIHaveToWait(...) ist ebenfalls durch ein synchronized(lock) geschützt.
Der Übersicht halber habe ich den code stark gekürzt, so ist das natürlich nicht lauffähig
Das Problem ist das sich der Zustand der Liste vor Beginn wo.wait() und nach der Methode DoIHaveToWait noch ändern kann. Es muss aber gewährleistet sein, das dies nur passieren kann wenn der Thread wartet.
(Wichtig ist vielleicht noch das wartende Threads nur innerhalb der Methode createNewWaitObject_AndPutItIntoList(...) benachrichtigt werden kann)
Gibt es da vielleicht eine Möglichkeit, dass Thread A Threadsicher vor einem wait() alle locks auf irgendwelche Objekte ab gibt, sodass ein anderer Thread B erst dann das lock erhalten kann sobald A sicher wartet? In diesem Fall könnte ich den synchronized Block auch um die den wo.wait() Aufruf ziehen
Viele Grüße
Ich hab folgendes Problem. Ich weiß während meines Programmablaufs erst kurz vor einem wait() ob und auf welches (wait-)Objekt wirklich gewartet werden muss.
Das wait-Objekt auf das gewartet werden soll wird während des Programmablaufs abh. von den weiteren existieren wait-Objekten erstellt.
Ob gewartet werden soll ist abhängig von allen anderen wait-Objekten für sämtliche Threads.
Die Bedingung ob gewartet werden muss und das erstellen eines neuen Threads dürfen also nicht gleichzeitig ausgeführt werden. Gleichzeitig muss aber auch das warten auf das Objekt direkt im Anschluss geschehen, sodass sich die Bedingungen nicht direkt vor dem warten ändern kann.
Pseudoprogramm
Java:
synchronized(lock);
{
WaitObject wo = createNewWaitObject_AndPutItIntoList(listOfAllOtherWaitObjects);
}
if (true == DoIHaveToWait(listOfAllOtherWaitObjects))
{
wo.wait();
}
Der Übersicht halber habe ich den code stark gekürzt, so ist das natürlich nicht lauffähig
Das Problem ist das sich der Zustand der Liste vor Beginn wo.wait() und nach der Methode DoIHaveToWait noch ändern kann. Es muss aber gewährleistet sein, das dies nur passieren kann wenn der Thread wartet.
(Wichtig ist vielleicht noch das wartende Threads nur innerhalb der Methode createNewWaitObject_AndPutItIntoList(...) benachrichtigt werden kann)
Gibt es da vielleicht eine Möglichkeit, dass Thread A Threadsicher vor einem wait() alle locks auf irgendwelche Objekte ab gibt, sodass ein anderer Thread B erst dann das lock erhalten kann sobald A sicher wartet? In diesem Fall könnte ich den synchronized Block auch um die den wo.wait() Aufruf ziehen
Viele Grüße
Zuletzt bearbeitet: