代码之家  ›  专栏  ›  技术社区  ›  qichuan

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

  •  7
  • qichuan  · 技术社区  · 16 年前

    2 回复  |  直到 16 年前
        1
  •  6
  •   Community Mohan Dere    6 年前

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

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

    When is a Singleton not a Singleton :

    两个或多个虚拟机中的多个单例

    当Singleton类的副本在多个VM中运行时,会为每台机器创建一个实例。每个VM都可以保存自己的单例,这一点似乎很明显,但在使用EJB、Jini和RMI的分布式系统中,情况就不那么简单了。由于中间层可以隐藏分布式技术,因此很难判断对象的实际实例化位置。

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

    如果您试图在EJB上下文中编写单个实例,EJB容器将单个EJB实例的标识分散到多个VM的能力会导致混淆。Singleton的实例字段不是全局唯一的。由于似乎是同一个对象涉及多个VM,因此可能会存在多个单例对象。

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

        2
  •  3
  •   Little Bobby Tables    16 年前

    是的,但没有外部设施不行。最简单的方法是使用 RMI