Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:基于Web的应用程序中的单例类实例_Java_Singleton - Fatal编程技术网

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

Java:基于Web的应用程序中的单例类实例,java,singleton,Java,Singleton,我在Web应用程序中有这个单例类 public class MyDAO { private static MyDAO instance; private MyDAO() { } public static MyDAO getInstance() { if (instance == null) { instance = new MyDAO(); } return instance;

我在Web应用程序中有这个单例类

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实例吗

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

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

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

您必须同步对
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();
但我会选择
法案清除
解决方案:

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

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

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


我读过《有效的Java》,并遵循如何正确编写单例的建议。你的不是。

如果多个线程进入该If条件,那么它将被实例化多次。它不是线程安全的。即使对于粘性类型的负载平衡器,我们也需要这个同步块吗??请指定。同步方法可能有点过分,因为您只需要在创建时同步。您是说3个用户访问还是3个java后端正在运行?3个用户访问作为群集过程一部分部署在3个Web服务器上的应用程序