跨 JVM 或应用程序实例或 Tomcat 实例的单例 [英] Singleton across JVM or Application instance or Tomcat instance

查看:29
本文介绍了跨 JVM 或应用程序实例或 Tomcat 实例的单例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我在 Tomcat(或任何其他服务器)的单个实例上部署并运行同一应用程序的 2 个实例.然后将创建单个对象(Singleton 类):

If I deploy and run 2 instances of same application on a single instance of Tomcat(Or any other server). Then a single object(of a Singleton class) would be created:

  1. 跨 Tomcat 的单个实例(但对于同一应用程序的 2 个实例很常见)或
  2. 跨应用程序实例(2 个应用程序实例不同)

所以本质上我想了解是否总是每个 JVM 创建一个 Singleton 类的对象?如果应用程序托管在 Web 服务器(或容器)上,这如何工作.

So essentially I want to understand that is it always a case that a single object of Singleton class gets created per JVM? How does this works in case of application hosted on a Web server(or container).

推荐答案

如果你有一个单例类并且你在 Tomcat 中运行两个使用这个类的 web 应用程序,这两个 web 应用程序将在运行 Tomcat 的 JVM 中获得这个单例的 2 个不同实例.

If you have a singleton class and you run two webapps that use this class in Tomcat both webapps will get 2 different instances of this singleton in JVM running the Tomcat.

但是如果您的 webapp 将使用来自 JRE 或 Tomcat 共享库的单例,例如 Runtime.getRuntime webapps 将获得相同的 Runtime 实例.

But if your webapp will use a singleton from JRE or Tomcat shared libs, eg Runtime.getRuntime webapps will get the same instance of Runtime.

这是因为 Tomcat 为 web 应用程序使用单独的类加载器.当 webapp 类加载器加载一个类时,它首先尝试在 webapp 类路径上找到它,如果找不到该类,它会要求父类加载器加载该类.

This is because Tomcat uses individual class loaders for webapps. When a webapp class loader loads a class it first tries to find it on webapp class path, if the class is not found it asks parent class loader to load the class.

这篇关于跨 JVM 或应用程序实例或 Tomcat 实例的单例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆