lock notify synchronisation

MatheStein

Aktives Mitglied
Hey Leute,

hab glaube ich gerade ein Brett vorm Kopf 😳

Warum ist es in Java so, dass "wait()" und "notify()" nur in synchronisierten Blöcken augerufen werden können? Irgendwie ist mir der Sinn dahinter gerade entfallen.


Gruß 🙂
 
Hey 🙂

Ja, aber warum? Warum kann ein Thread nicht auch ohne in Besitz eines Locks zu sein einfach in die "wait-queue" eingereiht werden? Hat das einen tieferen Sinn?
 
Und worauf sollte er dann warten???

Schon mal einen Blick auf das Concurrency Framework geworfen?
Da gibt es eine BlockingQueue (und vieles mehr), ist einfacher als selber mit wait/notifyAll zu arbeiten.
 
Also, angenommen ich habe zwei Threads t1 und t2 und eine Variable x die beiden zugänglich ist.
Angenommen die Aufgabe von t1 ist x einmalig zu modifizieren und die von t2 x nach der Modifikation auszulesen, dann wäre es doch am besten, wenn t2 direkt beim start in die wait-queue eingereiht wird und t1 weckt t2 auf nachdem sie x erfolgreich modifiziert hat.
In diesem Fall sollte es hier zu keinen Race-Conditions kommen und somit wäre eine Synchronisation unnötig, trotzdem müssten t1 und t2 synchronisierten werden um wait() und notify() benutzen zu dürfen.

Das ist der Punkt an dem mich das ganze etwas irritiert.
 
das war jetzt nur ein simples Beispiel 🙂 Mir ist auf die schnelle nichts besseres eingefallen.

Mit "Threads synchronisieren" meinte ich eher, dass um den Aufruf von wait() und notify() "unnötiger" Weise ein synchronized Block gelegt werden müsste (unnötig in dem Sinne, dass kein exklusiver Zugriff nötig ist, aber halt doch nötig, damit ich wait() bzw. notify() aufrufen kann)

Man könnte sich selbst sowas basteln und dann mit signal() und swait() anstatt notify() und wait() arbeiten, bietet aber Java selbst nicht schon ein ähnliches Konstrukt?

[JAVA=42]
class Signal {
private boolean set = false; // Eigentliche Signalvariable
public synchronized void signal() {
set = true;
notify(); // if a process is waiting deblock it
}
public synchronized void swait() {
if (set == false)
wait(); // wait for signal, leave the method
set = false;
}
}
[/code]

Gruß 🙂
 
Schon mal einen Blick auf das Concurrency Framework geworfen?
😉

Zu deine letzten Beispiel: In manchen Fällen funktioniert das, und ist vielleicht auch ganz praktisch ("oft" hat man ein privates monitor-Objekt, das genau den Zweck erfüllt, den dieses "Signal" hätte). Aber wenn es NUR das gäbe, wäre das unflexibler, und manche Sachen wären nicht möglich (konkretes Beispiel müßt' ich mir auch erst überlegen, aber dürfte nicht so schwer sein)
 

Zurück
Oben