web-dev-qa-db-fra.com

Singleton sur JVM ou instance d'application ou instance Tomcat

Si je déploie et exécute 2 instances de la même application sur une seule instance de Tomcat (ou tout autre serveur). Ensuite, un seul objet (d'une classe Singleton) serait créé:

  1. Sur une seule instance de Tomcat (mais courante pour 2 instances de la même application) OU
  2. À travers l'instance d'application (différent pour 2 instances d'application)

Donc, essentiellement, je veux comprendre que c'est toujours un cas qu'un seul objet de la classe Singleton soit créé par JVM? Comment cela fonctionne-t-il en cas d'application hébergée sur un serveur Web (ou conteneur).

21
Learner

Si vous avez une classe singleton et que vous exécutez deux webapps qui utilisent cette classe dans Tomcat, les deux webapps obtiendront 2 instances différentes de ce singleton dans JVM exécutant Tomcat.

Mais si votre application Web utilise un singleton de bibliothèques partagées JRE ou Tomcat, par exemple, les applications Web Runtime.getRuntime obtiendront la même instance de Runtime.

En effet, Tomcat utilise des chargeurs de classe individuels pour les applications Web. Lorsqu'un chargeur de classe webapp charge une classe, il essaie d'abord de la trouver sur le chemin de la classe webapp, si la classe n'est pas trouvée, il demande au chargeur de classe parent de charger la classe.

32
Evgeniy Dorofeev

Un singleton est normalement lié à un ClassLoader uniquement.

Donc, si vous avez un singleton basé sur un fichier .class dans votre fichier .war et que vous déployez cette application Web plusieurs fois, chaque application obtient son propre singleton.

D'un autre côté, si le fichier .class de votre singleton se trouve dans le chemin de classe de Tomcat, alors vous n'avez qu'une seule instance. Ce .class n'appartient pas à une application Web spécifique (il appartient à l'instance Tomcat).

Si vous avez le singleton dans les deux emplacements, cela dépend de la hiérarchie du chargeur de classe, et vous pouvez éventuellement choisir entre "parent d'abord" ou "application Web d'abord".

21
Beryllium

Il est possible de créer un tel singleton en s'assurant que vous interrogez toujours le même ClassLoader pour le singleton. J'ai écrit un explication détaillée dans cette autre réponse.

4
Rafael Winterhalter
  • Le Tomcat crée un nouveau chargeur de classe pour chaque application Web.
  • Donc, si votre classe Singleton est stockée dans un fichier war, le même fichier war aura deux instances dans le conteneur Tomcat, c'est-à-dire qu'il crée deux classes Singleton distinctes pour chaque fichier war.
  • Si la classe Singleton se trouve dans le chemin d'accès à la bibliothèque de partage de Tomcat, Tomcat crée une seule instance Singleton pour les deux applications.

analogie JVM:

JVM est comme un grand manoir. Il contient une famille combinée avec des applications et des bibliothèques.

Les ClassLoaders sont des membres de la famille, chaque membre de la famille représente un ClassLoader (fonctionne comme hiérarchie déléguée et non comme hiérarchie d'héritage). Remarque: ClassLoader est une classe, il peut créer plusieurs instances.

Les applications sont comme des appareils. par exemple: machine à laver, réfrigérateur, refroidisseur d'air, télévision, table à manger, canapé et ainsi de suite ...

Les bibliothèques ont chacune leur propre bibliothèque individuelle. Chacun recherche dans la bibliothèque des parents s'il n'est pas trouvé puis recherche dans sa propre bibliothèque.

limitations: Si le père achète un appareil, ses enfants peuvent l'utiliser, mais il ne peut pas être utilisé par ses parents et ses frères et sœurs. Chaque application peut utiliser différentes versions des mêmes bibliothèques. c'est-à-dire si la bibliothèque contient deux ou plusieurs versions des mêmes livres, elle choisit celle qui est disponible en premier.

Chaque numéro de famille ne peut utiliser qu'un seul appareil unique.

À la maison, nous pouvons utiliser plusieurs appareils de la même version. Ainsi, JVM nous permet d'exécuter plusieurs applications de mêmes versions.

Garbage Collector est un serviteur de Mansion, qui se déplace en tant que démon, qui peut effacer tout type d'objets.

La portée d'une variable statique est limitée à une par ClassLoader.

3
Premraj

<shakey-ground> Pour autant que je sache, un singleton est unique par chargeur de classe. Je pense donc que la réponse à votre question dépend de la façon dont le conteneur charge l'application Web.

S'il alloue un chargeur de classe par application Web, il semble que vous obtiendrez deux objets singleton complètement indépendants. Si elle alloue un chargeur de classe et que toutes les applications Web l'utilisent, elles partagent alors la même instance de singlet .</shakey-ground>

1
DaveH