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

时间:2010-05-11 11:53:11

标签: java

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

2 个答案:

答案 0 :(得分:6)

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

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

无论如何要考虑When is a Singleton not a Singleton

  

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

     

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

     

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

     

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

     

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

答案 1 :(得分:3)

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