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