一尘不染

跨JVM或应用程序实例或Tomcat实例的单例

tomcat

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

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

因此,从本质上讲,我想了解是否总是为每个JVM创建Singleton类的单个对象?如果应用程序托管在Web服务器(或容器)上,这是如何工作的。


阅读 311

收藏
2020-06-16

共1个答案

一尘不染

如果您有一个singleton类,并且在Tomcat中运行使用该类的两个Web应用程序,则这两个Web应用程序将在运行Tomcat的JVM中获得此Singleton的2个不同实例。

但是,如果您的Web应用程序将使用JRE或Tomcat共享库中的单个实例,例如Runtime.getRuntime
Webapps将获得相同的Runtime实例。

这是因为Tomcat对Web应用程序使用了单独的类加载器。当webapp类加载器加载类时,它首先尝试在webapp类路径上找到它,如果找不到该类,则要求父类加载器加载该类。

2020-06-16