# RMI synchronisation



## AndyL (27. Jan 2008)

Hallo!

Ich nutze Java 5 SE und RMI.
Nun habe ich ein synchronisations Problem.
Ich möchte den Zugriff auf ein RMI- Objekt synchronisieren.
Das heißt maximal ein Aufrufer darf dieses Objekt bearbeiten und muss es anschließend wieder
freigeben. Im Prinzip handelt es sich um das klassische Erzeuger-Verbrauer Problem.
Konzepte wie Monitore, Semaphoren und Bereiche aus dem Java concurrent Paket sind mir bekannt.

Wenn ich beispielsweise die Funktion:


```
synchronized void consume() { ... }
```
aufrufe und mir die Verbindung unterbrochen wird, dann ist kein weiterer
rmiClient in der Lage die consume() Methode aufzurufen, weil ein Lock besteht.

Im Netz konnte ich zu meinem Problem keine konkreten Lösungen finden.
Kann mir jemand bitte einen Ratschlag geben?

Viele Grüße

Andy


----------



## tfa (27. Jan 2008)

Wenn Du das Concurrency-Package schon kennst, hast Du es denn auch benutzt? Wie sieht der Code aus?
Normalerweise sollte im Fehlerfall eine RemoteException geworfen  werden. Die kann man fangen und das Lock freigeben. 
Wo ist das Problem?


----------



## AndyL (27. Jan 2008)

Hallo tfa,

vielen Dank erstmal für deine Antwort.
Nein derzeit nutze ich keine Klassen aus dem concurrent Paket.
Bin mir nicht sicher ob die im Zusammenhang mit RMI funktionieren werden.

Ich hab mir eine simple Semaphor gebastelt:


```
class semaphore extends UnicastRemoteObject implements semaphorInterface {

int value;

public semaphore (int res) {
value=res;
}

public synchronized void sperren() throws RemoteException {
	while (value == 0) {
		try {
			wait();
		} catch (InterruptedException e) {}
	}
	value--;
	}

public synchronized void freigeben() throws RemoteException {
	value++;
	notify();
}
}
```

Soweit funktioniert auch alles prima.
Zwei JVMs, bei einer erstellten semaphor mit Wert "1" bekommt nur ein Thread den Zugriff.
Der andere wartet solange bis der 1. Thread seine arbeit abgeschlossen hat und kann dann in den kritischen Bereich eintreten.

Ziehe ich nun aber beispielsweise das Netzkabel, entsteht eine deadlock Situation, da der 1. Thread nicht mehr in der Lage war, den gesperrten Bereich wieder freizugeben.


----------



## tfa (27. Jan 2008)

Achso, auf Serverseite soll die Synchronisation stattfinden. Ich würde sagen, das klappt so grundsätzlich nicht. Du könntest höchstens einen Timeout einbauen, aber dann bist Du auf das Conurrency-Framework angewiesen.

Ich würde die Synchronisation intern im Server implementieren, und nicht durch die Remote-Aufrufe. Also z.B. durch eine BlockingQueue.


----------



## AndyL (27. Jan 2008)

Hm...
ich kann deiner Idee noch nicht ganz folgen,
kannst du mir evtl. nen Beispiel geben?


----------



## tfa (27. Jan 2008)

Deine Clients möchten vom Server irgendwelche Aufgaben (in einem "kritischen Bereich", der Synchronisation erfordert) erledigen lassen. Hab ich das so richtig verstanden?
Hierzu könnte der Server die Anfrage des Clients (über die remote aufgerufene Methode) in eine Warteschlange schreiben, die von _einem_ Thread abgearbeitet wird. Wenn Informationen vom Server zum Client zurück gesendet werden  sollen, müsste man das synchron machen.
Da ich nicht genau weiß, was Du möchtest, ist ein konkreter Vorschlag schwierig.


----------

