PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java synchronized-Frage


Shink
2007-05-03, 10:42:09
Hallo.

In Java bezieht sich das synchronized-Schlüsselwort bei nicht-statischen Methoden ja auf die aktuelle Instanz der Klasse (also this).

Warum kann man nun aber so etwas machen, ohne ewig zu warten:
public synchronized void a() {
b();
}

public synchronized void b() {
}

Eigentlich müsste doch beim Einstieg in b() rauskommen: Auf this gibt es schon einen Lock! Ist das eine Ausnahme? Gibt es noch mehrere solche Fälle?

HellHorse
2007-05-03, 10:47:05
Weil die Montitore in Java reentrant sind. Wenn ein Prozess schon in einem Monitor ist, kann er ihn noch einmal aquirieren.

Shink
2007-05-03, 11:02:10
Danke. Und wie sieht es bei Exceptions aus: Gibt das Werfen einer Exception immer alle Locks bis zum nächsten Catch frei?

Grestorn
2007-05-03, 11:12:38
Danke. Und wie sieht es bei Exceptions aus: Gibt das Werfen einer Exception immer alle Locks bis zum nächsten Catch frei?

Wenn Du den Scope des Synchronizes verlässt, egal ob durch eine Exception oder durch den normalen Programmablauf, wird der Lock freigegeben.

Wenn Du innerhalb des Scope des synchronized die Exception fängst, bleibt der Lock bestehen.

Wenn Du eine Methode auf synchronized setzt, dann ist die ganze Methode im Scope des synchronized. Also, sobald die Methode verlassen wird, egal warum, wird der Lock freigegeben.

Monger
2007-05-03, 13:40:56
Weil die Montitore in Java reentrant sind. Wenn ein Prozess schon in einem Monitor ist, kann er ihn noch einmal aquirieren.
Sorry, ich versteh nur Bahnhof. Könntest du mir den Satz erklären?
Was ist ein Monitor?

Jürgen-Müller
2007-05-03, 13:41:43
Hallo.
Warum kann man nun aber so etwas machen, ohne ewig zu warten:
public synchronized void a() {
b();
}

public synchronized void b() {
}


Soweit ich weiß, wir mit dem schönen Wörtchen Syncronised nur der Zugriff auf die in der Methode benutzen Variablen gesperrt. Also, passiert bei deinem Beispiel durch das synchronized ohnehin nichts.

Grestorn
2007-05-03, 13:49:44
Soweit ich weiß, wir mit dem schönen Wörtchen Syncronised nur der Zugriff auf die in der Methode benutzen Variablen gesperrt. Also, passiert bei deinem Beispiel durch das synchronized ohnehin nichts.

Du weißt falsch.

Shink
2007-05-03, 14:37:49
Soweit ich weiß, wir mit dem schönen Wörtchen Syncronised nur der Zugriff auf die in der Methode benutzen Variablen gesperrt. Also, passiert bei deinem Beispiel durch das synchronized ohnehin nichts.
Ganz falsch: Genau das passiert nicht! Der Code würde dem entsprechen:
public void a() {
synchronized (this) {
b();
}
}

public void b() {
synchronized (this) {
}
}

Variablen kann man von ausserhalb in Java trotzdem ändern.

Monitor: http://de.wikipedia.org/wiki/Monitor_(Informatik)

Soll heißen: Methoden, die einem Monitor zugeordnet sind (z.B. sind in Java synchronized-Methoden der aktuellen Klasseninstanz zugeordnet), können nicht gleichzeitig ausgeführt werden.
So die Idee dahinter. Aber wie es tatsächlich realisiert ist ist ja möglicherweise eine andere Frage.

Xmas
2007-05-03, 14:55:01
Sorry, ich versteh nur Bahnhof. Könntest du mir den Satz erklären?
Was ist ein Monitor?
Monitore in Java: http://www.artima.com/insidejvm/ed2/threadsynch.html

Da ein Thread sich nicht selbst blockieren kann, darf er auch problemlos mehrfach ein Lock auf dasselbe Objekt anfordern bevor er es freigibt.

Monger
2007-05-03, 15:01:34
Monitore in Java: http://www.artima.com/insidejvm/ed2/threadsynch.html

Da ein Thread sich nicht selbst blockieren kann, darf er auch problemlos mehrfach ein Lock auf dasselbe Objekt anfordern bevor er es freigibt.
Danke!
Das war mir in groben Zügen zwar schon klar, aber ich wusste die Fachbegriffe dafür nicht.