单例对象和Java servlet

单例对象和Java servlet,java,servlets,Java,Servlets,当我使用servlet访问单例Java对象时,该对象对于给定的servlet线程来说只是“单个”或“一个实例”,或者在服务器操作系统(如Linux)的整个JVM中是单个的 我的意思是,当客户机连接到servlet/服务时,单例对象对于为每个客户机创建的每个线程都是唯一的,还是在机器中安装的整个JVM中都是唯一的 我认为这取决于singleton是如何实现的,但给定应用程序的所有请求都在同一个VM中执行,因此它应该是所有请求的一个实例 编辑:这是假设一个直接的单例实现,类似于: public cl

当我使用servlet访问单例Java对象时,该对象对于给定的servlet线程来说只是“单个”或“一个实例”,或者在服务器操作系统(如Linux)的整个JVM中是单个的


我的意思是,当客户机连接到servlet/服务时,单例对象对于为每个客户机创建的每个线程都是唯一的,还是在机器中安装的整个JVM中都是唯一的

我认为这取决于singleton是如何实现的,但给定应用程序的所有请求都在同一个VM中执行,因此它应该是所有请求的一个实例

编辑:这是假设一个直接的单例实现,类似于:

public class MySingleton {
    private static MySingleton _instance;

    // for sake of simplicity, I've left out handling of 
    // synchronization/multi-threading issues...
    public static MySingleton getInstance() {
        if (_instance == null) _instance = new MySingleton();
        return _instance;
    }
}

当您创建一个单例实例时,所有请求实例都将为它使用的当前类加载器共享同一个实例。

我认为该对象对于每个用户都是唯一的,而不是整个JVM。唯一的持久性信息是您在用户会话中输入的信息

我不确定,但我认为您可以使用在整个应用程序服务器中完成一个类的实例,但是我不知道它是如何完成的

更新:

摘自Java文章

由不同类加载器同时加载的多个单例 当两个类装入器装入一个类时,实际上您有该类的两个副本,每个副本都可以有自己的单例实例。这在某些servlet引擎(例如iPlanet)中运行的servlet中尤其相关,其中每个servlet默认使用自己的类加载器。事实上,两个不同的servlet访问一个联合单例将得到两个不同的对象

多类加载器的出现比您想象的更为常见。当浏览器从网络加载类供小程序使用时,它们会为每个服务器地址使用单独的类加载器。类似地,Jini和RMI系统可能会使用一个单独的类加载器,用于下载类文件的不同代码库。如果您自己的系统使用自定义类装入器,则可能会出现所有相同的问题


如果由不同的类加载器加载,则具有相同名称的两个类,甚至相同的包名称,都被视为不同的类——即使它们实际上是同一类中的逐字节类。不同的类加载器代表不同的名称空间来区分类(即使类的名称相同),因此这两个MySingleton类实际上是不同的。(请参阅参考资料中的“类加载器作为名称空间机制”)。由于两个单例对象属于同名的两个类,乍一看,似乎有两个单例对象属于同一个类。

因为所有的
servlet
都在运行在单个
JVM
的Web服务器上运行,对于所有servlet,只有一个
Singelton
对象

是的,它是
Singleton
。但是单例的范围取决于类所在的位置

如果它位于应用程序内部,则它是该应用程序的单例。如果同一类存在于另一个应用程序中,则会为该应用程序创建另一个对象,并且该对象是该应用程序的单例对象

如果它位于应用程序外部和服务器内部,则它是VM的单例。

根据这一点


每个Web应用程序都有自己的类加载器,因此单例对于一个应用程序来说是唯一的,而对于另一个应用程序来说它是不可见的

我曾经用一些RESTful Web服务尝试过这种方法,希望它们有一些“状态”,但这是不可能的,单例对于每个连接都是新的。哇,所有其他答案都不一样。如果能看到一些有效的例子就好了。我是根据我的个人经验来回答的;它重定向到Java技术页面。谢谢@Tragedian,我已经修复了它,但是,这就是为什么我将文章的内容复制并粘贴到链接的正下方:-)那么你的意思是,所有客户端都将获得存储在Singleton类中的相同数据,如果有存储的话?是的,它将确保所有客户端共享相同的实例。我是否实现了仅对客户端请求唯一的单例实现,或者我只需要在servlet上创建一个静态类?Singleton的实现通常是静态的。不要将servlet设置为静态的。无论您需要一个实例并且其他客户端共享什么对象,都可以使用static@xybrek关于如何实现单例,请查看我在回答中给出的链接,但是,我坚持我的回答,如果在Servlet中完成,它将不是一个单一的对象。我如何使单例实现仅在客户端请求中是唯一的?那么您不需要单例-您想做什么?我正在尝试创建一个“管理器”类,该类将包含一些基于Http客户端操作的值。这些值不应该与其他Http客户端操作混合在一起。我想您最初的问题已经得到了回答(单例的范围)。也许你应该提出一个新的问题,描述你想要达到的目标和遇到的问题,我们可以帮助你。这取决于课堂上的位置。如果该类存在于每个应用程序的WEB-INF/lib中。将为每个应用程序创建单例。