2009-08-10 6 views
1

J'utilise RMI pour implémenter certains algorithmes distribués, et puisque nous transmettons des objets assez volumineux, je voudrais des précisions sur le moment où RMI transmet des objets sérialisés sur le réseau. Supposons que je possède une classe à distance avec la méthode suivante:En utilisant Java RMI, quand exactement l'objet sérialisé est-il transmis sur le réseau?

class MyServer extends Remote { 
    public synchronized void foo (Bar bar) { 
     ... 
     Thread.wait(); 
     ... 
    } 
} 

Maintenant, j'ai deux (ou plus) clients RMI appelant la méthode MyServer.foo. Lorsque Le client 1 l'appelle, il est bloqué dans Thread.wait(). Ensuite, Le client 2 appelle foo et il est bloqué car le client 1 est toujours dans la méthode foo qui est synchronisée.

Maintenant, la question est: Quel est le bar paramètre du client appel transmis sur le réseau? Une seule fois Le client 2 peut réellement entrer la méthode foo ou avant, lorsqu'il est bloqué?

Question supplémentaire: S'agit-il (du moment où les objets sont transmis) d'un comportement imposé par les spécifications RMI ou est-ce spécifique à l'implémentation?

+0

Ce code ne compile même pas. Pas clair ce que vous demandez. – EJP

Répondre

1

Il semble y avoir quelques problèmes avec votre exemple.

Je suppose que Thread.wait() est en fait this.wait(), car il n'y a pas de telle méthode sur Thread. Et l'attente doit être appelée sur le même objet que celui utilisé pour effectuer la synchronisation. En supposant cela, lorsque Client 1 appelle le lock.wait(), le moniteur sur le bloc de synchronisation est libéré. Cela signifie que le client 2 peut accéder à la méthode et finira par bloquer à la même méthode d'attente. Wait() sera libéré quand un autre thread appellera notify() sur la même instance de MyServer. En ce qui concerne la sérialisation, cela se produit avant que cette méthode ne soit appelée. Cela aurait eu lieu dans le code RMI qui appelle cette méthode.

+0

'Thread.wait()' est en effet une méthode, mais elle est héritée de 'Object.wait()' et est certainement une mauvaise chose à appeler. – EJP

1

Le paramètre bar est transmis dans la même requête que la demande d'invocation de la méthode foo, qui fait partie du protocole RMI.

Questions connexes