Threads: wait() und notify()

sh33p

Bekanntes Mitglied
Moin,

habe mal eine Verständnis Frage. Die Methoden wait() und notify() können ja benutzt werden, um eine bestimmte deterministische Abfolge zu erreichen. Ich habe im Inet in einigen Beispielen gesehen, das z.b wait und notify benutzt wurden, wenn ein Schreiber eine Ressource schreiben sollte und ein Leser diese lesen sollte. Hier wurde wait und notify dann so eingesetzt,das wenn z.b das Array, auf das geschrieben wurde, voll ist, gewartet wird bis wieder platz ist(wait() ) und dann die Methode, die schreibt, durch ein notify() des Lesers benachrichtigt wurde, das sozuzusagen wieder platzt ist.
Wie würde ich das z.b in so einer Situation machen:

Java:
public synchronized void set(int i){

this. i = i;

}

public synchronized int get(){
return i;
}

Ich möchte natürlich erreichen, das erst gelesen wurde, wenn set() mit dem setzen fertig ist.Und das set() erst den Wert setzt, wenn get() mit dem lesen fertig ist und das keine deadlocks auftreten.
Aber wie kommunizier ich sozusagen zwischen den 2 Methoden? Hier fehlen mir ja solche Bedingungen wie.. "Wenn das Array voll ist..dann". Könnte man das über ein boolean Flag machen?:)
 

Marco13

Top Contributor
Entweder über ein flag, oder indem 'i' einen Wert hat, der als "noch nicht gesetzt" gilt, und der abgefragt wird... Etwas mehr Kontext könnte aber ggf hilfreich sein.
 

sh33p

Bekanntes Mitglied
Java:
public class Test{


private int z;
public Test(int z){
  this.z = z;
}

public synchronized void set(int z){
  this.z = z;
}
public synchronized int get(){
return z;

}
public  synchronized void macheEtwas(Test t){
  int a = t.get();
  t.set(z);
  set(a);
}
}

Sagen wir mal, das ich diese Klasse thread-sicher machen will. Wie sähe dann eine sinnvolle implementierung aus?

>objekt variable boolean flag deklarieren
> in get(), wenn flag = false ist, wait().. usw.
> in set(), wenn flag = false ist, wait().. usw.

?
 

Marco13

Top Contributor
Hm... beschreib' ggf. nochmal genauer, was du meinst: Das setzen und lesen an sich ist durch das synchronized schon "atomar gemacht", d.h. das ist threadsicher. Ich dachte jetzt, es geht darum, auf einen bestimmten Wert zu warten....!?
 

sh33p

Bekanntes Mitglied
ich wollte vielmehr darauf eingehen,ob die Benutzung der Methode machEtwas() thread-sicher ist.
ist hier eine deterministische abfolge gewährleistet und können hier deadlocks auftreten?

also ich denke:


durch die synchronistation ist eine deterministische abfolge gewährleistet. Bsp:

Thread A erhält den "Schlüssel" des Sperrobjektes, geht in den Monitor und führt set(1) und get() (ist ja 1 aus).
Wenn Thread A fertig ist, wird der Schlüssel freigegeben, Thread B erhält den Schlüssel und führt set(2) und get() (ist ja 2) aus. So dass eine deterministsche Abfolge gewährleistet ist.
Ein Deadlock kann nicht auftreten, da ein Thread ja nicht auf das "frei werden" eine belegten Ressource warten muss.

Seh ich das richtig?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
OK, also geht es gar nicht um wait und notify, sondern nur(?) um die Frage, ob in der macheEtwas ein Deadlock auftreten kann?!

Ich find' sowas schwierig zu beantworten :oops: aber es sieht für mich zumindest für den Fall gefährlich aus, dass es zwei Test-Objekte und zwei Threads gibt, und die beiden Threads jeweils macheEtwas auf einem der Test-Objekte aufrufen wollen, und als Argument jeweils das andere Test-Objekt übergeben werden soll:

Thread A betritt a.macheEtwas(b), hat in diesem Moment den Lock auf a
Thread B betritt b.macheEtwas(a), hat in diesem Moment den Lock auf b
Thread A will a.get() aufrufen - muss auf den Lock warten, den Thread B hat
Thread B will b.get() aufrufen - muss auf den Lock warten, den Thread A hat
-> Deadlock

Falls dieser Fall auftreten kann, sollte man sich etwas anderes überlegen...
 

sh33p

Bekanntes Mitglied
Objekt A
---------
Thread A ruft
a.macheEtwas b auf()
. Hat in diesem
moment Lock auf A

Objekt B
--------
Thread B ruft b.machetwas(a) auf, und hat in diesem moment lock auf b


Jetzt wird auf Objekt A von Thread A b.get() in macheEtwas aufgerufen
Hier muss Thread A aber auf den Lock warten den Thread B hat

Thread B will a.get() in macheEtwas auf Objekt B aufrufen,muss aber auf
den Lock von Thread A warten


Dadurch blockieren sich beide und es entsteht ein Deadlock.
Der entsteht aber nur, weil wir für jedes Objekt 1 Monitor
haben, also in dem Fall 2 Monitore. Meintest du das?
 
Zuletzt bearbeitet:

sh33p

Bekanntes Mitglied
Also ich glaube du meinst diese Situation

Es wird diese Klasse als Thread gestartet bzw. es werden 2 Threads
dieser Klasse gestartet. In einer RunMethode existieren 2 Objekte der Klasse Test. Objekt a und b.
In der Run-Methode würde dann a.doit(b) und b.doit(a) aufgerufen.
Wir haben also 2 Threads und 2 Objekte. Da die doit Methode synchronized ist, wird um jede Instanz
der Klasse Test( Also um das Objekt a und b) ein Monitor gebaut.
Kommt jetzt Thread1 in den Monitor von Objekt b so ruft er a.doit(b) auf. Das heisst Thread
1 besitzt gerade das Lock von Objekt a. Kommt anschließend Thread 2 in den Monitor von Objekt B, so ruft er
b.doit(a) auf.Das heisst Thread 2 besitzt gerade das Lock von Objekt B.
Innerhalb von doit() versucht nun Thread 1 b.get() aufzurufen, muss aber warten mit dem Aufruf bis
B frei ist.
Innerhalb von doit() versucht nun Thread 2 a.get() aufzurufen, muss aber warten mit dem Aufruf bis
A frei ist.Das führt zu einem Deadlock
 

Marco13

Top Contributor
Also ich glaube du meinst diese Situation
...
Mit ein paar Löschungen...

...Thread1 ... ruft ... a.doit(b) auf. ...Thread 1 besitzt gerade das Lock von Objekt a.
...Thread2 ... ruft ... b.doit(a) auf. ...Thread 2 besitzt gerade das Lock von Objekt b.
Innerhalb von doit() versucht nun Thread 1 b.get() aufzurufen, muss aber warten mit dem Aufruf bis B frei ist.
Innerhalb von doit() versucht nun Thread 2 a.get() aufzurufen, muss aber warten mit dem Aufruf bis A frei ist.
Das führt zu einem Deadlock

Sieht das ziemlich nach dem aus, was ich gepostet hatte :)

Achtung, Halbwissen:
Ich meine sogar mal irgendwo gelesen zu haben (war das nicht bei FindBugs oder PMD?) dass man synchronized-Methoden "vermeiden" sollte, und die Synchronisation am besten komplett innerhalb der Klasse, und in bezug auf ein privates "monitor-objekt" gemacht werden sollte, weil man dadurch verhindern kann, dass jemand von außen auf das Objekt synchonisiert, und durch sowas wie
Code:
synchronized (dasObjekt) { dasObjekt.machWas(); ... }
deadlocks erzeugt, die nicht entstehen müßten, wenn man die synchronisation komplett weggekapselt hätte. Aber ... wie konsequent und systematisch man das (sinnvoll) umsetzen könnte, weiß ich nicht...
 

sh33p

Bekanntes Mitglied
d.h man sollte eventuell blöcke verwenden zum synchronisieren und das Schlüssel Objekt
private deklarieren?
Bei Methoden kann ich ja das Objekt (this) nicht private deklarieren..


aber um nochmal kurz zu dem obigen Beispiel zu kommen.
Hier kommt es nur zu einem Problem,weil 2 Instanzen und damit 2 Monitore bestehen ?!
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Nochmal, das hatte ich nur irgendwo mal gelesen - richtig systematisch umgesetzt oder als echte "Coding Guideline" habe ich es noch nicht gesehen, aber es klang zumindest plausibel und vernünftig.

Sowas wie
Code:
public synchronized void foo()
{
   // Code
}
ist gleichbedeutend mit
Code:
public void foo()
{
    synchronized (this)
    {
       // Code
    }
}
... aber das meintest du wohl nicht? :bahnhof:


Wie auch immer: Wenn es nur einen monitor gibt, kann es grundsätzlich nicht zu einem Deadlock kommen. Ein Deadlock entsteht (etwas vereinfacht und pauschalisiert) bei Mustern der Form
Code:
void methodX()
{
    synchronized(a) 
    {
        synchronized(b) 
        {
            // Code
        }
    }
}

void methodY()
{
    synchronized(b) 
    {
        synchronized(a) 
        {
            // Code
        }
    }
}
also bei "verschachtelten und verschränkten" synchronisationen: Ein Thread hat den lock auf a, und braucht den auf b, um weiterzumachen, und ein anderer Thread hat den Lock auf b, und braucht den auf a, um weiterzumachen. Leider ist das nicht immer so "offentlichtlich" - wie auch in deinem Beispiel, wo das Problem ja NUR auftritt, wenn a.doit(b) und b.doit(a) "gleichzeitig" von zwei Threads aufgerufen werden. Bei a.doit(b) und b.doit(xxx) würde es (soweit ich das jetzt im Kopf überfliege) kein Problem geben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
S bin zu blöd für threads - wait, notify, synchronized Java Basics - Anfänger-Themen 11
M Threads, wait() und notify() Java Basics - Anfänger-Themen 10
G Threads steuern mit wait und notify Java Basics - Anfänger-Themen 2
O Problem bei der Synchronisierung von Threads (wait&notif Java Basics - Anfänger-Themen 4
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
W Threads Alphabet Java Basics - Anfänger-Themen 20
H Threads Anfänger Java Basics - Anfänger-Themen 17
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13
A Threads und .join Java Basics - Anfänger-Themen 14
W Threads starten Java Basics - Anfänger-Themen 2
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
J Wieviele threads? Java Basics - Anfänger-Themen 9
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
O Threads Java Basics - Anfänger-Themen 2
L Buchungssystem und Threads Java Basics - Anfänger-Themen 2
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
S Gemeinsame Ressource und Mehrfachinstanziierung von Threads Java Basics - Anfänger-Themen 16
S Verklemmung Threads Java Basics - Anfänger-Themen 11
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
M Threads run Methode Java Basics - Anfänger-Themen 4
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
J Aufgabe(Threads) richtig verstanden/implementiert Java Basics - Anfänger-Themen 27
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
J Threads Java Basics - Anfänger-Themen 38
D Alte Klausuraufgabe Threads Java Basics - Anfänger-Themen 10
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
R Threads in JavaFX Java Basics - Anfänger-Themen 3
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
J ConcurrentCalculation Multi Threads in Java Java Basics - Anfänger-Themen 3
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
M "restartable" threads Java Basics - Anfänger-Themen 11
M Threads - summieren Java Basics - Anfänger-Themen 13
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Threads - Programm analysieren Java Basics - Anfänger-Themen 2
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
T Threads Threads richtig synchronisieren Java Basics - Anfänger-Themen 3
D [Concurrency/Threads] Code Umsetzung Schriftlich Java Basics - Anfänger-Themen 2
D Threads Java Basics - Anfänger-Themen 4
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
T Java-Threads Java Basics - Anfänger-Themen 0
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Problem mit Threads Java Basics - Anfänger-Themen 11
M Threads - wo gehören sie hin? Java Basics - Anfänger-Themen 3
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
J Threads Java Basics - Anfänger-Themen 3
F ExecutorService und offene Threads Java Basics - Anfänger-Themen 3
P Threads Threads nicht nebenläufig Java Basics - Anfänger-Themen 7
M Threads nicht nebenleblaufig Java Basics - Anfänger-Themen 2
B Threads parallel zur main Java Basics - Anfänger-Themen 3
M Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M Threads und Methodenübergreifender Variablezugriff Java Basics - Anfänger-Themen 2
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
H Threads Java Basics - Anfänger-Themen 10
B synchronized threads Java Basics - Anfänger-Themen 17
E Mehrmaliges Ausführen eines Threads Java Basics - Anfänger-Themen 5
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
R Threads Verständnisschwierigkeit Java Basics - Anfänger-Themen 2
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
G Methoden in Threads wandeln Java Basics - Anfänger-Themen 7
H Threads Java Basics - Anfänger-Themen 17
F Java Concurrency - Threads Java Basics - Anfänger-Themen 4
V Threads Threads synchronisieren Java Basics - Anfänger-Themen 4
T Threads Join() = Block? oO Java Basics - Anfänger-Themen 4
J Threads ArrayList Problem bei Threads Java Basics - Anfänger-Themen 3
C Objekte durchschleifen / Threads Java Basics - Anfänger-Themen 2
J Threads stoppen mit interrupt - Frage dazu Java Basics - Anfänger-Themen 7
N Pingen in Threads Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben