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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java:基于Web的应用程序中的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实例吗?

答案

您必须同步访问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;
    }
另一答案

不,它是每个JVM一个。线程安全要小心。

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

另一答案

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

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

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

以上是关于Java:基于Web的应用程序中的Singleton类实例的主要内容,如果未能解决你的问题,请参考以下文章

基于 Web 的 Java 应用程序来读取 LDAP

从基于 Java 的 azure Web 应用程序读取本地文件共享

csharp C# - 简单的SerialPort单例类|示例:https://heiswayi.github.io/2016/csharp-simple-serialport-singleton-c

Java Web 应用程序中的角色管理

如何在基于 servlet 的 Web 应用程序中运行后台任务?

如何在KIOSK模式下打开基于Java的Web应用程序?