多个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中.
| 归档时间: |
|
| 查看次数: |
4524 次 |
| 最近记录: |