A singleton holds a private static instance of itself.
并非总是如此,事实上,这甚至不是在 Java 中实现它的最佳方式。
public enum Director {
INSTANCE;
public int getFive() {
return 5;
}
}
是一个完全有效的单例,并且比拥有其自身私有静态实例的类更有可能保持唯一存在的副本。
1. Should it's members also be static
不,成员不应该是静态的,因为这样就不需要类,因此不需要该类是单例。所有静态例程都存在代码维护问题,类似于 C/C++ 函数。即使使用单例您不会有多个实例要处理,但将方法从一个实例中取出可以为您提供一定的能力来改变未来的代码。
2. If the answer to 1. is unequivocally yes.
不是,所以不需要回答#2。
3. Is the private instance needed because the JVM needs a
referable object (THE singleton) to hold on to for the
length of its (JVM's) life?
不,需要私有实例,因为您必须有能力确定在访问之前是否调用了构造函数。这通常通过检查实例变量是否为空来完成。考虑到竞态条件和类加载器,要使这样的代码正确是非常困难的。使用枚举技术,您可以确保只有一个实例,因为 JVM 内部不会受到相同类型的竞争条件的影响,即使它们存在,也只能保证向程序环境呈现一个实例。
There is a requirement to make multiple concurrent remote calls within
a tomcat hosted web application (the app utilizes GWT for some components,
so I can utilize a servlet for this aforementioned requirement if a good
solution requires this). Currently, I create an executor service with a cached
thread pool into which I pass my callables (each callable containing an endpoint
configuration), for each individual process flow that requires such calls. To
me it would make sense if the thread pool was shared by multiple flows, instead
of spawning pools of their own. Would a singleton holding a static thread pool be
a good solution for this?
这取决于。池中的线程将做什么?如果它是一个线程来处理任务,最终它们都会被长时间运行的任务所束缚,可能会饿死其他关键处理。如果您有大量任务要执行,也许重组类似于 NIO 中使用的回调模式的处理实际上可能会给您更好的性能(其中一个线程处理许多任务的回调调度,没有池) .
在您提出处理问题的第二种方法或提供更多可用的操作环境细节之前,唯一提出的解决方案通常是一个好的解决方案。
PS。请不要扩展环境的细节。问题提交过程很简单,因此如果您想扩展第二部分,请将其作为独立问题重新提交。