Java:基于Web的应用程序中的Singleton类实例

时间:2012-09-22 15:33:41

标签: java singleton

我在Web应用程序中有这个Singleton类。

public class MyDAO 
 {


    private static MyDAO instance;

    private MyDAO() {
    }

    public static MyDAO getInstance() {
        if (instance == null) {
            instance = new MyDAO();
        }
        return instance;
    }

我将以这种方式访问​​

public void get_Data()
{

        MyDAO dao = MyDAO.getInstance();
}

如果有3个用户访问应用程序,将创建多少个MyDAO类对象?

每个用户会有一个MyDAO实例吗?

3 个答案:

答案 0 :(得分:5)

您必须同步getInstance()的访问权限。否则一些线程可能会看到一个未完全初始化的版本。

有关Singleton Pattern

的更多信息

同步后,JVM中只会有一个实例。无论有多少变量引用该对象。但是如果您运行的是N个服务器,则每个JVM中都会有一个实例。总共N个实例。

您可以仔细检查您是否使用Java 5.0或更早版本:

private static volatile MyDAO();
 public synchronized static MyDAO getInstance() {
    if (instance == null) {
        instance = new MyDAO();
    }
    return instance;

但是如果你的应用程序总是需要一个实例,你可以急切地实例化它:

private static MyDAO = new MyDAO();

但我会选择Bill Purge解决方案:

    private static class MyDAOHolder { 
            public static final MyDAO INSTANCE = new MyDAO();
    }

    public static MyDAO getInstance() {
            return MyDAOHolder.INSTANCE;
    }

答案 1 :(得分:2)

不,这是每个JVM的一个。小心线程安全。

我读过“Effective Java”并遵循有关如何正确编写单例的建议。你的不是它。

答案 2 :(得分:0)

只有一个,即单身人士的定义。

要同步实例化,以确保只返回要使用的完整对象:

private static Object semaphore = new Object();
public static MyDAO getInstance() {
    synchronized(semaphore)
        if (instance == null) {
            instance = new MyDAO();
        }
    }
    return instance;
}