Singleton через экземпляр JVM или приложения или экземпляр Tomcat - программирование
Подтвердить что ты не робот

Singleton через экземпляр JVM или приложения или экземпляр Tomcat

Если я развертываю и запускаю 2 экземпляра одного и того же приложения на одном экземпляре Tomcat (или на любом другом сервере). Затем будет создан один объект (класса Singleton):

  • Через один экземпляр Tomcat (но обычный для 2 экземпляров одного приложения) OR
  • В дополнение к экземпляру приложения (для двух экземпляров приложения - разные)

Итак, по сути, я хочу понять, что всегда так, что на JVM создается один объект класса Singleton? Как это работает в случае приложения, размещенного на веб-сервере (или контейнере).

4b9b3361

Ответ 1

Если у вас есть одноэлементный класс, и вы запускаете два webapps, которые используют этот класс в Tomcat, то оба webapps получат два разных экземпляра этого синглтона в JVM, запускающем Tomcat.

Но если ваш webapp будет использовать одноэлемент из общих разделов JRE или Tomcat, например, Runtime.getRuntime Webapps получит тот же экземпляр Runtime.

Это потому, что Tomcat использует отдельные загрузчики классов для webapps. Когда загрузчик класса webapp загружает класс, он сначала пытается найти его в пути класса webapp, если класс не найден, он запрашивает загрузчик родительского класса для загрузки класса.

Ответ 2

Синтаксис обычно привязан только к ClassLoader.

Итак, если у вас есть singleton, основанный на файле .class в вашем .war файле, и вы разворачиваете это веб-приложение несколько раз, каждое приложение получает свой собственный синглтон.

С другой стороны, если файл .class вашего singleton находится в пути к классам tomcat, тогда у вас есть только один экземпляр. Этот класс не относится к определенному веб-приложению (он принадлежит экземпляру tomcat).

Если у вас есть синглтон в обоих местах, это зависит от иерархии загрузчика классов, и вы можете выбрать сначала "родительский первый" или "веб-приложение".

Ответ 3

Можно создать такой синглтон, гарантируя, что вы всегда запрашиваете тот же ClassLoader для singleton. Я написал подробное объяснение в этом другом ответе.

Ответ 4

<shakey-ground> Насколько я знаю, singleton уникален для каждого загрузчика классов. Поэтому я думаю, что ответ на ваш вопрос зависит от того, как контейнер загружает веб-приложение.

Если он выделяет один загрузчик классов для каждого веб-приложения, то похоже, что вы получите два полностью независимых одноэлементных объекта. Если он выделяет один загрузчик классов и все веб-приложения используют его, то они имеют один и тот же синглетный экземпляр. </shakey-ground>

Ответ 5

  • Tomcat создает новый загрузчик классов для каждого веб-приложения.
  • Итак, если ваш класс Singleton хранится в военном файле, тот же файл войны будет иметь два экземпляра в контейнере Tomcat, т.е. он создает два отдельных класса Singleton для каждого файла войны.
  • Если класс Singleton находится в пути к общей библиотеке Tomcat, Tomcat создает только один экземпляр Singleton для обоих приложений.

JVM-аналогия:

JVM похож на большой особняк. Он содержит комбинированное семейство с серверными приложениями и библиотеками.

ClassLoaders являются членами семейства, каждый член семейства представляет один ClassLoader (работает как иерархия делегатов, а не иерархия наследования). Примечание: ClassLoader является классом, он может создавать несколько экземпляров.

Приложения похожи на устройства. например: стиральная машина, холодильник, воздушный холодильник, телевизор, обеденный стол, диван и т.д.

Библиотеки каждый имеет свою собственную библиотеку. Каждый поиск в родительском освободителе, если не найден, затем выполняется поиск в его собственной библиотеке.

ограничения: Если отец покупает прибор, его дети могут его использовать, но он не может использовать его родитель и сиблинги. Каждое приложение может использовать разные версии одних и тех же библиотек. т.е. если библиотека содержит две или более версии одних и тех же книг, она выбирает в зависимости от того, какая книга доступна в первую очередь.

Каждый семейный номер может использовать только одно уникальное устройство.

В домашних условиях мы можем использовать mulitple-устройство той же версии. Таким образом, JVM позволяет нам запускать несколько приложений одинаковых версий.

Сборщик мусора - это слуга в Особняке, который бродит как демон, который может очистить любые объекты.

Объем статической переменной ограничен одним классом ClassLoader.