早上好。
我目前正在开发一个部署在Apache Tomcat 7服务器上的Java Web Service项目。为了满足项目的需要,我需要在内存中维护一个全局的(在每个请求创建的WS线程中)对象。因此,我尝试按如下方式实现Singleton设计模式:
public class SingletonDesign {
private static boolean _instanceFlag = false;
private static final SingletonDesign _instance = new SingletonDesign();
private static GlobalObject _myGlobalObject;
private SingletonDesign() {
if(_instanceFlag == false) {
_myGlobalObject = new GlobalObject();
_instanceFlag = true;
}
}
public static GlobalObject getModel() {
if(_instanceFlag == false) {
_myGlobalObject = new GlobalObject();
_instanceFlag = true;
}
return _myGlobalObject;
}
public static int parseModel() {
if(_instanceFlag == false) {
_myGlobalObject = new ItemSimilarityModel();
_instanceFlag = true;
}
int val = _myGlobalObject.parseFromFile();
return val;
}
}
我知道每次请求完成后,我的Web服务类(对象)上都会创建一个新线程。我的目标是在所有线程中拥有一个全局的SingletonDesign对象,它在内存中保持活动状态,并且只创建一次。 尽管上述设计似乎符合我的期望,但我不确定它是否正确。所以这些是我的问题:
1)为什么SingletonDesign对象的方法需要是静态的? (我试图将它们定义为非静态,但我的Singleton对象未正确初始化。)
2)以上设计可从Singleton Design Pattern的Wikipedia页面看到。令我困惑的部分是_instance字段的初始化,我在其他Singleton实现中也看到过。为什么我们需要那个对象?
3)在服务器停止之前,我的对象是否保持活动状态?我做了一些测试,似乎它仍然活着,但我必须100%确定。
感谢您的时间和兴趣。
答案 0 :(得分:2)
_instance
字段包含您的单身人士。您需要一个静态getInstance()
方法,而您的其他方法将是实例方法。我认为你根本不需要_instanceFlag
字段。
然后你会按如下方式调用它:
SingletonDesign.getInstance()getGlobalObject();
尽管如此,请记住很多人(包括我自己)对Singleton的事情作为代码嗅觉。此外,这种设计不被认为是在Java中实现Singleton的最佳方式,cfr:What is an efficient way to implement a singleton pattern in Java?
只要其类加载器保持活动状态,该对象就会保持活动状态。
答案 1 :(得分:1)
1)在单例中实际需要的唯一静态方法是返回单例实例的方法。该方法必须是静态的,因为您无法实例化单例,因此该方法必须属于类而不是对象。
2)可能更容易开始的简化版本:
public class MySingleton {
private static MySingleton instance = null;
private static String aString = null;
private MySingleton( {
aString = new String("Hello, world");
}
public static MySingleton getInstance() {
if (instance == null) {
instance = new MySingleton();
}
return instance;
}
public string getMyString() {
return aString;
}
}
3)据我所知,只要JVM运行,它就会保持活着。
作为提示,如果在返回实例的方法中执行某种初始化代码,我建议将该方法声明为同步。