2010-05-11 6 views
7

Est-il possible de créer une classe Singleton universelle, qui est, à un moment donné, une seule instance partagée par plusieurs processus Java?Comment créer une classe Singleton inter-processus en Java

+2

Un par connexion univers/serveur/utilisateur? –

+0

Ou multivers? Mais ceux-ci sont difficiles - les trous blancs continuent de crever de nouvelles instances quand vous vous y attendez le moins. – mdma

+1

Ceci n'est pas un doublon de la question indiquée. L'autre question fait référence à une application dans son ensemble. Cette question concerne spécifiquement le modèle de Singleton à travers les limites du processus. – howettl

Répondre

6

Plusieurs processus Java ne partagent pas la même machine virtuelle. Vous obtiendrez ainsi une instance JVM hébergeant le singleton, puis une instance JVM par processus accédant au singleton à l'aide de Remote Method Invocation comme suggéré par @Little Tables.

Quoi qu'il en soit considérer When is a Singleton not a Singleton:

singletons multiples dans deux ou plusieurs machines virtuelles

Lorsque des copies de la course de classe Singleton dans plusieurs machines virtuelles, une instance est créée pour chaque machine. Que chaque VM puisse contenir son propre Singleton peut sembler évident mais, dans les systèmes distribués tels que ceux utilisant les EJB, Jini et RMI, ce n'est pas si simple. Puisque les couches intermédiaires peuvent masquer les technologies distribuées, il peut être difficile de savoir où un objet est réellement instancié. Par exemple, seul le conteneur EJB décide comment et quand créer des objets EJB ou recycler ceux qui existent déjà. L'EJB peut exister dans une VM différente du code qui l'appelle. De plus, un même EJB peut être instancié simultanément sur plusieurs machines virtuelles. Pour un bean session sans état, plusieurs appels à ce qui apparaît, à votre code, pour constituer une instance peuvent en fait être des appels à des instances différentes sur des machines virtuelles différentes. Même une entité EJB peut être sauvegardée via un mécanisme de persistance entre les appels, de sorte que vous n'avez aucune idée de l'instance qui répond aux appels de votre méthode. (La clé primaire qui fait partie de la spécification de bean entité est nécessaire précisément parce que l'identité référentielle est inutile pour identifier le bean.)

La capacité des conteneurs EJB à diffuser l'identité d'une seule instance EJB sur plusieurs machines virtuelles confusion si vous essayez d'écrire un Singleton dans le contexte d'un EJB. Les champs d'instance du Singleton ne seront pas globalement uniques. Étant donné que plusieurs machines virtuelles sont impliquées pour ce qui semble être le même objet, plusieurs objets Singleton peuvent être créés.

Les systèmes basés sur des technologies distribuées telles que EJB, RMI et Jini doivent éviter les singletons qui conservent leur état. Les singletons qui ne tiennent pas d'état mais contrôlent simplement l'accès aux ressources ne sont pas non plus appropriés pour les EJB, puisque la gestion des ressources est le rôle du conteneur EJB. Cependant, dans d'autres systèmes distribués, les objets Singleton qui contrôlent les ressources peuvent être utilisés en sachant qu'ils ne sont pas uniques dans le système distribué, seulement dans la machine virtuelle particulière.

3

Oui, mais pas sans installations externes. Le moyen le plus simple est d'utiliser RMI. Les autres options comprennent CORBA ou Web Services - Il suffit de google up.

Questions connexes