如何在Java中创建跨进程的Singleton类

是否可以创建一个通用的Singleton类,在任何给定的时间,只有一个实例在多个Java进程之间共享?

多个Java进程不共享同一个虚拟机。

因此,最终会有一个托管单例的JVM实例,然后每个进程一个JVM实例使用远程方法调用访问单例,如@Little Bobby Tables所示。

无论如何,考虑什么时候单身人士不是单身人士 :

两个或更多虚拟机中的多个单身人士

当Singleton类的副本在多个VM中运行时,将为每台计算机创建一个实例。 每个VM都可以拥有自己的Singleton似乎很明显,但是在分布式系统中,例如那些使用EJB,Jini和RMI的系统,并不是那么简单。 由于中间层可以隐藏分布式技术,因此可能难以分辨对象实际实例化的位置。

例如,只有EJB容器决定如何以及何时创建EJB对象或回收现有对象。 EJB可能存在于与调用它的代码不同的VM中。 此外,可以在多个VM中同时实例化单个EJB。 对于无状态会话bean,对您的代码显示为一个实例的多次调用实际上可能是对不同VM上的不同实例的调用。 甚至可以通过调用之间的持久性机制来保存实体EJB,这样您就不知道哪个实例会回答您的方法调用。 (作为实体bean规范的一部分的主键是正确的,因为引用标识在标识bean时没有用。)

如果您尝试在EJB的上下文中编写Singleton,EJB容器跨多个VM传播单个EJB实例的身份的能力会导致混淆。 Singleton的实例字段不是全局唯一的。 由于几个VM涉及看似相同的对象,因此可能会出现几个Singleton对象。

基于EJB,RMI和Jini等分布式技术的系统应该避免保持状态的Singletons。 不拥有状态但只是控制对资源的访问的单例也不适合EJB,因为资源管理是EJB容器的角色。 但是,在其他分布式系统中,可以使用控制资源的Singleton对象,理解它们在分布式系统中不是唯一的,只是在特定的VM中。

是的,但不是没有外部设施。 最简单的方法是使用RMI 。 其他选项包括CORBA或Web服务 – 只需谷歌搜索。