群集时如何处理静态对象?

时间:2011-05-06 10:51:50

标签: java java-ee singleton cluster-computing

静态对象只初始化一次。单例类只实例化一次。如果我们在集群中使用单例,那么它将在集群中创建多个单例实例。 那么集群环境中的静态对象会发生什么? 为什么此对象未在其他群集服务器中初始化?或为什么对象状态不会改变?

3 个答案:

答案 0 :(得分:3)

集群中的每个节点都在一个单独的JVM中运行 - 因此每个JVM(集群节点)都将拥有它自己的Singleton。如果将集群视为JVM系统,那么集群中Singleton的实例数量就等于节点数。

群集范围的Singleton无法使用普通的Java类实现。您可能需要一个提供单例的单个(非群集)服务器实例。

答案 1 :(得分:3)

静态对象始终在ClassLoader的范围内(在大多数情况下是每个JVM),并且不在群集中考虑。如果您需要Singleton,您必须告诉容器创建一个。 它取决于Singleton的性质,如果它应该只存在于每个Cluster一个或每个JVM一次或每个Classloader一次。

答案 2 :(得分:2)

单身人士在一个过程中甚至不可靠。您可以通过多个类加载器加载相同的类,最终得到多个“单例”对象。

Singleton是一种反模式的原因 - 避免它

在集群中情况更糟,因为所有节点必须协调以确定单例的位置。这很容易受到网络分区的影响,因此无法维持。 Brewer的CAP Theorem将为您提供一些背景知识。