Frage(n) zu synchronisierten Funktionen

glhlg

Mitglied
Guten Morgen,

ich muss da noch mal nachhaken!
Es geht mir um sychronisierte Funktionen / Methoden.

Fall 1:
Nehmen wir eine Klasse mit mehreren synchronisierten statischen Methoden.
Wenn ich jetzt irgendwo im Code MeineKlasse.irgendwas1(); aufrufe, ist dann zur gleichen Zeit MeineKlasse.irgendwas2(); gesperrt? Also wird mit der ausführung gewartet, bis die Ausführung von irgendwas1() beendet ist?

Wenn ich das richtig verstanden habe, muss irgendwas2() warten, bis irgendwas1() fertig ist, richtig?


Fall 2:
Und was ist mit den Funktionen aus der Klasse, die nicht synchronisiert sind? Sind die automatisch mit gesperrt, während eine statische synchronisierte Funktion dieser Klasse ausgeführt wird?


Fall 3:
Nehmen wir eine Klasse ohne statische Funktionen, aber mit synchronisierten Methoden, von der es später mehrere Instanzen geben soll.
Wenn ich jetzt eine Instanz habe und Methode machwas1() aufrufe, ist dann das ganze Objekt komplett gesperrt?

Ich vermute, dass die ganze Instanz gesperrt ist, einschl. nicht synchronisierter Methoden. Andere Instanzen hingegen können ohne Beeinträchtigung weiter genutzt werden.


Fall 4:
Wie sieht das Ganze aus, wenn es sich um ein Webprojekt handelt?
Wenn ich da eine Klasse mit statischen synchronisierten Funktionen habe und ein Webseiten-Nutzer veranlasst den Aufruf von irgendwas1(), sind dann diese und alle anderen statischen synchronisierten Funktionen dieser Klasse für alle anderen Webseiten-Nutzer verfügbar, oder wird gewartet, bis die vom ersten Nutzer aufgerufene irgendwas1() beendet ist? Also ist das pro Nuter getrennt?

Ich denke mir, dass die gesamte Klasse für alle Webseiten-Nutzer gesperrt ist, sobald von einem Nutzer eine statische synchronisierte Funktion aufgerufen wird. Somit würde das auch nicht synchronisierte Funktionen dieser Klasse betreffen, richtig?



Vielen Danke schon mal für eure Hilfe! :)
Ich habe schon gegoogelt und mir einiges durchgelesen, aber so ganz sicher bin ich mir nicht.

Gruß
Gerrit
 
Fall 1:
Nehmen wir eine Klasse mit mehreren synchronisierten statischen Methoden.
Wenn ich jetzt irgendwo im Code MeineKlasse.irgendwas1(); aufrufe, ist dann zur gleichen Zeit MeineKlasse.irgendwas2(); gesperrt? Also wird mit der ausführung gewartet, bis die Ausführung von irgendwas1() beendet ist?

Wenn ich das richtig verstanden habe, muss irgendwas2() warten, bis irgendwas1() fertig ist, richtig?
Wenn beide Methoden statisch und synchronisiert sind: korrekt.

Fall 2:
Und was ist mit den Funktionen aus der Klasse, die nicht synchronisiert sind? Sind die automatisch mit gesperrt, während eine statische synchronisierte Funktion dieser Klasse ausgeführt wird?
Nein.

Fall 3:
Nehmen wir eine Klasse ohne statische Funktionen, aber mit synchronisierten Methoden, von der es später mehrere Instanzen geben soll.
Wenn ich jetzt eine Instanz habe und Methode machwas1() aufrufe, ist dann das ganze Objekt komplett gesperrt?

Ich vermute, dass die ganze Instanz gesperrt ist, einschl. nicht synchronisierter Methoden. Andere Instanzen hingegen können ohne Beeinträchtigung weiter genutzt werden.
Nicht statische, synchronisierte Methoden sperren this, d.h. die Instanz, für welche die Methode aufgerufen wird. Andere Instanzen sind davon nicht betroffen, wie du ganz richtig erkannt hast. Nicht synchronisierte Methoden derselben Instanz können aber weiterhin nebenläufig ausgeführt werden.

Beim Fall 4 muss ich auf einen Experten verweisen, da ich davon keine Ahnung habe.

Grüße, Matthias
 
Danke für deine schnelle Antwort :)

Nicht synchronisierte Methoden derselben Instanz können aber weiterhin nebenläufig ausgeführt werden.
Wie muss ich mir das dann vorstellen, wenn ich eine Instanz habe, dessen Methoden alle nicht synchronisiert sind und ich dieses Objekt in einem synchronized-Block verwende?
Code:
SynchroTestObj sto = new SynchroTestObj();
		
synchronized(sto) {
	sto.machwas1();
	sto.machwas2();
}

Kann dann zeitgleich mit der Instanz von sto gearbeitet werden? Oder in wie weit ist die Instanz gesperrt?
 
Das Objekt was du zum synchonisieren benutzt gibt es vor. D.h. wenn du in allen synchornized Blücken das gleiche Objekt benutzt, kann nur eine davon zu einem Zeitpunkt laufen und die anderen müssen warten.

Statische sync Methoden ist das Objekt was zum synchronisieren benutzt wird die Klasse selbst. Bei Instanz-Methoden ist es die Instanz.
 
Zurück