8

我在 Web Application 中有这个 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 实例吗?

4

3 回答 3

5

您必须同步对getInstance(). 否则,某些线程可能会看到未完全初始化的版本。

更多关于单例模式

同步后,. 文件中将只有一个实例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;
    }
于 2012-09-22T15:36:21.713 回答
2

不,每个 JVM 一个。注意线程安全。

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

于 2012-09-22T15:36:35.370 回答
0

只有一个,那就是单例的定义。

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

private static Object semaphore = new Object();
public static MyDAO getInstance() {
    synchronized(semaphore)
        if (instance == null) {
            instance = new MyDAO();
        }
    }
    return instance;
}
于 2012-09-22T15:36:12.387 回答