java - Singleton 对象和 Java servlet

标签 java servlets

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

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

最佳答案

我认为该对象对于每个用户来说都是唯一的,而不是对于整个 JVM 而言。唯一持久的信息是您放入用户 session 中的信息。

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

更新:

摘自Java文章"When is a Singleton not a Singleton?"

不同类加载器同时加载多个单例 当两个类加载器加载一个类时,您实际上拥有该类的两个副本,并且每个副本都可以有自己的 Singleton 实例。这对于在某些 servlet 引擎(例如 iPlanet)中运行的 servlet 尤为重要,其中每个 servlet 默认情况下都使用自己的类加载器。事实上,两个不同的 Servlet 访问联合 Singleton 将获得两个不同的对象。

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

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

关于java - Singleton 对象和 Java servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11358985/

相关文章:

java - JMeter JDBC 响应消息 : java. sql.SQLException:没有找到适合 jdbc:oracle 的驱动程序:

java - java Web 应用程序中的 Log4j 错误

java - 在servlet中获取系统变量

java - Struts2 - SessionMonitor - 页面未正确重定向

apache-poi - 使用 java 生成 MS Word 报告并导出

java - 是否有一个好的 XML 解析器可以对 XML 文件进行光扫描以获取元素的字节偏移量?

java - 如何使用 Java GUI 面板?

java - 运行时exec输出路径

java - 将 jasper 报告下载到服务器中的特定位置

java - 可以从流中读取带符号的字节吗?