2010-05-11 18 views
7

¿Es posible crear una clase Singleton universal, que es, en un momento dado, solo una instancia se comparte en múltiples procesos Java?Cómo crear una clase Singleton de proceso cruzado en Java

+2

¿Uno por cada universo/servidor/usuario? –

+0

¿O multiverso? Pero estos son complicados: los agujeros blancos siguen cavando nuevas instancias cuando menos lo esperas. – mdma

+1

Esto no es un duplicado de la pregunta indicada. La otra pregunta hace referencia a una aplicación como un todo. Esta pregunta es específicamente sobre el patrón Singleton a través de los límites del proceso. – howettl

Respuesta

6

Múltiples procesos de Java no comparten la misma máquina virtual.

Así terminaría con una instancia de JVM que aloja el singleton, luego una instancia de JVM por proceso que acceda al singleton utilizando la Invocación remota de métodos como lo sugirieron @Little Bobby Tables.

consideran todos modos When is a Singleton not a Singleton:

Singleton múltiple en dos o más máquinas virtuales

Cuando se crea copias de la clase Singleton carrera en varias máquinas virtuales una instancia para cada máquina. Que cada VM pueda tener su propio Singleton puede parecer obvio, pero en sistemas distribuidos como los que usan EJB, Jini y RMI, no es tan simple. Dado que las capas intermedias pueden ocultar las tecnologías distribuidas, es difícil decir dónde se crea una instancia real de un objeto.

Por ejemplo, solo el contenedor EJB decide cómo y cuándo crear objetos EJB o reciclar los existentes. El EJB puede existir en una máquina virtual diferente del código que lo llama. Además, un solo EJB puede ser instanciado simultáneamente en varias máquinas virtuales. Para un bean de sesión sin estado, las llamadas múltiples a lo que aparece, a su código, para ser una instancia podrían ser llamadas a instancias diferentes en diferentes máquinas virtuales. Incluso una entidad EJB se puede guardar a través de un mecanismo de persistencia entre llamadas, para que no tenga idea de qué instancia responde a las llamadas de su método. (La clave primaria que es parte de la entidad Bean Spec es necesaria precisamente porque la identidad referencial no sirve para identificar el bean).

La capacidad de los contenedores EJB para propagar la identidad de una única instancia EJB en múltiples máquinas virtuales provoca confusión si intenta escribir un Singleton en el contexto de un EJB. Los campos de instancia de Singleton no serán globalmente únicos. Debido a que varias máquinas virtuales están involucradas en lo que parece ser el mismo objeto, varios objetos Singleton podrían existir.

Los sistemas basados ​​en tecnologías distribuidas como EJB, RMI y Jini deben evitar los Singleton que mantienen el estado. Los singletons que no mantienen el estado sino que simplemente controlan el acceso a los recursos tampoco son apropiados para EJB, ya que la administración de recursos es la función del contenedor EJB. Sin embargo, en otros sistemas distribuidos, los objetos de Singleton que controlan los recursos se pueden usar en el entendimiento de que no son únicos en el sistema distribuido, solo en la máquina virtual en particular.

3

Sí, pero no sin instalaciones externas. La forma más simple es usar RMI. Otras opciones incluyen CORBA o servicios web: solo busque en google.

Cuestiones relacionadas