# RMI thread safe ?



## Gugliotta (10. Aug 2004)

Hallo zusammen,

ich progge gerade mit RMI herum.

Wenn gleichzeitig mehrere Clients die RMI Schnittstelle und ein Objekt/eine Funktion nutzen,
wird dann für jeden Client ein Thread erzeugt ?

Sprich, muss ich da noch selbst wechselseitigen Ausschluß, Threads, o.ä. sicherstellen, dass sie sich nicht gegenseitig beeinflussen können, oder wird das schon von RMI bereitgestellt ?


----------



## Grizzly (10. Aug 2004)

Gute Frage ???:L . RMI an sich sollte schon Thread safe sein. Ansonsten könnte man damit wahrscheinlich nicht viel anfangen. Vor allem da ja Application Server, wie bspw. JBoss, auf RMI aufbauen.
Deine eigenen Klassen musst Du dann natürlich selber Thread safe machen  .


----------



## Gugliotta (10. Aug 2004)

Danke Grizzly.

Du hast mir aber nicht so überzeugt geklungen.  :wink: 

Weiss jemand mehr, genauer Bescheid ?


----------



## Guest (10. Aug 2004)

Alle Clients greifen auf die gleiche Instanz eines Remote-Objekts zu.
Klartext: Du musst selbst für die Thread-Sicherheit sorgen.


----------



## Guest (10. Aug 2004)

Es wird nur für jeden remote-Methodenaufruf ein eigener Thread gestartet, d.h. der Server kann dann mehrere Clients gleichzeitig bedienen. Die arbeiten dann aber wie gesagt auf einer Instanz.


----------



## Leeprasteen (11. Aug 2004)

bedeutet das, dass je client nur in einer klasse eine schnittstelle zum Server-Objekt angelegt werden soll. diese kann dann von allen anderen klassen auf dem client genutzt werden und müsste threadsafe angelegt sein!?


----------



## Gugliotta (16. Aug 2004)

Sie arbeiten auf einer Instanz. Ok.
Für jeden Methodenaufruf wird aber ein eigener Thread erzeugt. 

Dass heisst, dass wenn zwei Clients ein und diesselbe Methode aufrufen,
für jeden Client ein Thread erzeugt wird. Diese Threads laufen getrennt voneinander ab.
Also kann es nicht passieren, dass 2 Clients, sofern sie dieselbe Methode mit denselben Variablen aufrufen,
sich gegenseitig in die Quere kommen, und der eine ne Variable überschreibt die der andere dann benutzt. 

Stimmt's ????
Oder hab ich es immer noch nicht verstanden ????


----------



## apfelsine (15. Dez 2004)

ich wüßte gerne ob diese Ausführung wahr ist:

wenn ich verhindern möchte, das ein Client in den Variablen des 
anderen Clients rumpfuscht, weil der die gleiche Instanz eines Objektes
verwendet, muß ich meinen Server als Thread für jeden Client starten, damit
das nicht passiert?
ist das so?!?


und was macht die RMI-Registry, wenn ich mit jedem Thread ein Objekt eintrage,
das den gleichen Namen hat? das wird dann vermutlich überbügelt oder?


gruß
apfelsine


----------



## foobar (15. Dez 2004)

> wenn ich verhindern möchte, das ein Client in den Variablen des
> anderen Clients rumpfuscht, weil der die gleiche Instanz eines Objektes
> verwendet, muß ich meinen Server als Thread für jeden Client starten, damit
> das nicht passiert?
> ist das so?!?


Nein, du mußt die Methoden im RemoteObject synchronisieren, damit die Clients sich nicht in die Quere kommen.


----------



## apfelsine (15. Dez 2004)

äh  ???:L 
kannst du mir einen Tip geben wie du das meinst?
ein minibeispiel oder so?


----------



## foobar (15. Dez 2004)

```
public class MyImpl extends UnicastRemoteObject
{
   public MyImpl() throws RemoteException
   {
   }

   public snychronized void deposit()
   {
       // deposit some money
   }

   public synchronized double withdraw()
   {
       // withdraw money from account
   }

}
```


----------



## apfelsine (15. Dez 2004)

achso :-D
vielen Dank


----------

