【发布时间】:2011-05-06 10:51:50
【问题描述】:
静态对象只初始化一次。单例类只实例化一次。如果我们在集群中使用单例,那么它将在集群中创建多个单例实例。 那么集群环境中的静态对象会怎样呢? 为什么这个对象没有在其他集群服务器中初始化?或者为什么对象状态没有改变?
【问题讨论】:
标签: java jakarta-ee singleton cluster-computing
静态对象只初始化一次。单例类只实例化一次。如果我们在集群中使用单例,那么它将在集群中创建多个单例实例。 那么集群环境中的静态对象会怎样呢? 为什么这个对象没有在其他集群服务器中初始化?或者为什么对象状态没有改变?
【问题讨论】:
标签: java jakarta-ee singleton cluster-computing
静态对象总是在 ClassLoader 的范围内(在大多数情况下每个 JVM)并且不考虑在集群中。如果你需要一个 Singleton,你必须告诉容器创建一个。 这取决于您的 Singleton 的性质,是每个集群只存在一个,还是每个 JVM 存在一个,或者每个 Classloader 存在一个。
【讨论】:
集群中的每个节点都在单独的 JVM 中运行 - 因此每个 JVM(集群节点)都有自己的 Singleton。如果你把集群看成一个 JVM 系统,那么集群中 Singleton 的实例数确实等于节点数。
集群范围的 Singleton 不能用普通的 Java 类实现。您可能需要提供单例的单个(非集群)服务器实例。
【讨论】:
单例在单个进程中甚至都不可靠。您可以通过多个类加载器加载同一个类,并最终得到多个“单例”对象。
单例是一种反模式是有原因的——避免它。
集群中的情况更糟,因为所有节点必须协调以决定单例的位置。这很容易受到网络分区的影响,因此是站不住脚的。 Brewer 的CAP Theorem 将为您提供有关这方面的一些背景信息。
【讨论】: