Newsgroup Archiv - Beiträge
auf www.Bastie.de
Synchronisation von Methodenaufrufen
Frager: Carsten Schaefer vom Mitwoch, 31. Januar 2001
Folgende Problemstellung:
RMI-Anwendung, bei der verschiedene Klienten auf Methoden eines Servers zugreifen.
Wie kann ich sicherstellen, dass bestimmte Methoden zu einem Zeitpunkt nur von
genau 1 Klienten aufgerufen/durchlaufen werden können, d.h. alle anderen
Klienten sollen warten, bis die Methode abgearbeitet ist und erst dann darf der
nächste Klient die Methode durchlaufen.
Ein einfaches synchronized als Modifier der Methode hatte leider nicht die
gewünscte Wirkung.
gruse
Carsten
1. Antwort: Markus Riehl vom Mittwoch, 31. Januar 2001
Du hast mehrere Möglichkeiten.
1. public synchronized void myMethod ()
Funktioniert mit Sicherheit, ist aber evtl. mit Kanonen auf Spatzen geschossen,
da die komplette Instanz gesperrt wird. Wenn Du also mehrere Methoden nach dieser
Art definierst, so kann jeweils nur eine einzige dieser synchronisierten Methoden
(oder auch mit synchronized (this) synchronisierte Blöcke) auf einmal ausgeführt
werden. Wenn es Dir nur um diese eine Methode geht, ist das nicht sinnvoll.
2.
...
private Object sem = new Object();
...
public void myMethod() {
synchronized (sem) {
...
}
}
...
Damit ist nur die Methode synchronisiert. Für jede Methode, die nur von einem
Client gleichzeitig ausgeführt werden soll, kannst Du solche Semaphoren
definieren. Der Vorteil ist, Du kannst auf diese Weise z.B. zwei oder mehr
Methoden sperren, so dass nur eine dieser auf diese Art gesperrten Methoden
gleichzeitig aufgerufen werden kann.
3. Solltest Du NICHT machen! Kostet CPU und ist nicht sicher!!!
private boolean busy;
...
public void myMethod() {
while (busy);
busy = true;
...
busy = false;
}
Gibt bestimmt noch mehr Möglichkeiten, man muss es aber nicht übertreiben.
Viele Grüße,
Markus
Anmerkung: Der Thread ging noch weiter, ohne dass weitere Möglichkeiten erörtert wurden.
Daher verzichte ich wieder einmal auf den vollständigen Gesprächsfaden.
zur Übersicht
all rights reserved © Bastie - Sebastian Ritter @:
w³: http://www.Bastie.de
Diese Seite ist Bestandteil der
Internetpräsenz unter http://www.Bastie.de
Java
Cobol
Software
Resourcen
Service
Links
Über mich
Zum Gästebuch
Forum