Java Web服务的持久Singleton对象

时间:2012-09-03 11:01:35

标签: java singleton java-ws

早上好。

我目前正在开发一个部署在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%确定。

感谢您的时间和兴趣。

2 个答案:

答案 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运行,它就会保持活着。

作为提示,如果在返回实例的方法中执行某种初始化代码,我建议将该方法声明为同步。