Singleton en JVM o instancia de aplicación o instancia de Tomcat

Si despliegue y ejecute 2 instancias de la misma aplicación en una sola instancia de Tomcat (o cualquier otro servidor). Entonces se crearía un único objeto (de una clase Singleton):

  1. En una sola instancia de Tomcat (pero común para 2 instancias de la misma aplicación) O
  2. A través de la instancia de la aplicación (diferente para 2 instancias de la aplicación)

Entonces, esencialmente, quiero entender que siempre es un caso que un solo objeto de la clase Singleton se crea por JVM? ¿Cómo funciona esto en el caso de la aplicación alojada en un servidor web (o contenedor)?

Si tiene una clase singleton y ejecuta dos webapps que utilizan esta clase en Tomcat, ambas aplicaciones obtendrán 2 instancias diferentes de este singleton en JVM que ejecute Tomcat.

Pero si su aplicación web usará un singleton de JRE o bibliotecas compartidas de Tomcat, por ejemplo, Runtime.getRuntime webapps obtendrá la misma instancia de Runtime.

Esto se debe a que Tomcat utiliza cargadores de clases individuales para webapps. Cuando un cargador de clase de webapp carga una clase, primero intenta encontrarlo en la ruta de clase de la webapp, si la clase no se encuentra le pide al cargador de clases padre que cargue la clase.

Un singleton normalmente está vinculado a un ClassLoader solamente.

Por lo tanto, si tiene un singleton basado en un archivo .class en su archivo .war e implementa esta aplicación web varias veces, cada aplicación obtiene su propio singleton.

Por otro lado, si el archivo .class de su singleton está en el classpath de tomcat , entonces solo tiene una instancia. Esta .class no pertenece a una aplicación web específica (pertenece a la instancia de tomcat ).

Si tiene el singleton en ambas ubicaciones, depende de la jerarquía del cargador de clases, y posiblemente pueda seleccionar entre “primero el padre” o “primero la aplicación web”.

Es posible crear dicho singleton asegurando que siempre consulte el mismo ClassLoader para el singleton. Escribí una extensa explicación en esta otra respuesta.

Hasta donde yo sé, un singleton es único por cargador de clases. Por lo tanto, creo que la respuesta a su pregunta depende de la forma en que el contenedor carga la aplicación web.

Si asigna un cargador de clases por aplicación web, parece que obtendría dos objetos singleton completamente independientes. Si asigna un cargador de clases y todas las aplicaciones web lo usan, entonces comparten el mismo singlete en una instancia.

  • El Tomcat crea un nuevo cargador de clases para cada aplicación web.
  • Entonces, si su clase Singleton está almacenada en un archivo war, el mismo archivo war tendrá dos instancias en el contenedor Tomcat, es decir, creará dos clases Singleton separadas para cada archivo war.
  • Si la clase Singleton está en la ruta de la biblioteca compartida Tomcat, Tomcat crea solo una instancia Singleton para ambas aplicaciones.

Analogía JVM:

JVM es como una gran mansión. Contiene una familia combinada con varias aplicaciones y bibliotecas.

Los ClassLoaders son miembros de la familia, cada miembro de la familia representa un ClassLoader (funciona como una jerarquía de delegates y no como una jerarquía de herencia). Nota: ClassLoader es clase, puede crear instancias múltiples.

Las aplicaciones son como electrodomésticos. por ejemplo: lavadora, nevera, refrigerador de air, Telivision, mesa de comedor, sofá, etc.

Las bibliotecas tienen cada una su propia biblioteca individual. Cada búsqueda en la biblioteca de los padres si no se encuentra busca en su propia biblioteca.

limitaciones: si el padre compra un electrodoméstico, sus hijos pueden usarlo, pero no puede usarlo su padre ni sus familiares. Cada aplicación puede usar diferentes versiones de las mismas bibliotecas. es decir, si la biblioteca contiene dos o más versiones de los mismos libros, escoge el libro que esté primero disponible.

Cada número de familia puede usar un solo dispositivo único.

En casa, podemos usar un dispositivo múltiple de la misma versión. Entonces, JVM nos permite ejecutar múltiples aplicaciones de las mismas versiones.

Garbage Collector es un servent en Mansion, que deambula como un daemon, que puede limpiar cualquier tipo de Objetos.

El scope de una variable estática está limitado a uno por ClassLoader.