В веб-контейнере создается / управляется более 1 объекта одного класса, который имеет одну и ту же ссылочную переменную
Наверное, самый глупый вопрос, который вы когда-либо слышали.
В веб-контейнере создается / управляется более 1 объекта одного класса, который имеет одну и ту же ссылочную переменную... Позвольте мне объяснить на примере.
Внутри моего класса контроллера у меня есть кусок кода
AdminUser adminUser= новый AdminUser();
Таким образом, когда 2 администратора войдут в мое веб-приложение, будет 2 объекта класса AdminUser с той же ссылочной переменной "adminUser"
- Как это возможно, это 2 разных темы?
- Кто управляет этими темами, веб-контейнер?
- Если да, то, как это делает веб-контейнер, оборачивает ли он код приложения с помощью threadLocal?
- Если для поддержки глобального объекта (скажем, счетчика посещений администраторов) используются разные потоки, "статического" будет недостаточно... вместо этого оно должно быть "изменчивым", верно?
3 ответа
Это был ответ, который я искал. Спасибо всем, кто ответил.
Создает ли сервер приложений новый поток для каждого запроса от одного и того же пользователя?
Web Container (Tomcat) порождает новый поток для каждого запроса (на самом деле он не использует пул потоков из соображений производительности).
Для любого запроса (неважно, кто его сделал) поток получается из пула, запрос обрабатывается, а затем поток возвращается в пул.
Таким образом, когда 2 администратора войдут в мое веб-приложение, будет 2 объекта класса AdminUser с той же ссылочной переменной "adminUser"
Нет.
Если эта строка кода находится в методе, переменная находится в стеке, и может быть столько экземпляров, сколько существует одновременных вызовов метода, включая рекурсии и вызовы из нескольких потоков.
Если это код инициализации нестатического члена, переменная находится в объекте, и количество экземпляров равно количеству объектов.
Если объект является бином, их количество зависит от области действия объекта: если приложение, один; если сессия, одна на сессию; если просмотр, один на просмотр; и т.п.
Если это код инициализации статического члена, этого не должно быть.
Как это возможно, это 2 разных темы?
Смотри выше.
Кто управляет этими темами, веб-контейнер?
Да, и это также управление экземплярами bean-компонентов.
Если да, то, как это делает веб-контейнер, оборачивает ли он код приложения с помощью threadLocal?
См. Выше.
Если для поддержки глобального объекта (скажем, счетчика посещений администраторов) используются разные потоки, "статического" будет недостаточно... вместо этого оно должно быть "изменчивым", верно?
Нет. Вы можете поддерживать его как член экземпляра bean-объекта в области приложения.
Вы должны полностью избегать статики в веб-приложении, кроме констант и кешей, которых также следует избегать.
Есть несколько факторов, которые влияют на ответы на ваши вопросы, у j2ee есть собственная спецификация, которой должны следовать производители, и другие, которые они должны просто реализовать, как они хотят. Это дать представление, которое они хотят, или как они должны действовать в определенные моменты. Jboss, безусловно, отличается от проблем с производительностью Apache Tomcat, что затрудняет ответ на ваш первый вопрос. Затем ответьте: "Это зависит от того, с каким поставщиком вы говорите. В частности, какой контейнер?" Это также зависит от того, реализуете ли вы Enterprise JavaBeans в своем коде, потому что тогда, вероятно, будет запущено несколько Бинов (объектов) (в зависимости от контейнера), и при каждом запросе от клиента он может совместно использовать эти Бины или создавать новые для учета конкуренции.
Отвечая на их четвертый вопрос, по моему мнению, лучшим методом будет счетчик синглов-компонента сеанса (реализация EJB). Но вы могли бы сделать это через статический класс, в котором все другие объекты могут совместно использовать, но пришлось бы разрешить конкуренцию между объектами. EJB решает этот конкурс для вас без необходимости тратить время на это. для этого и многих других вещей решение EJB
Я думаю, что если вы не реализуете EJB и создаете очень простой код, для каждого запроса, который выполняет клиент, будет создан и уничтожен объект (не совсем, потому что он зависит от JVM, который нужно уничтожить, сбор мусора, но его недоступность для вы) после отправки ответа клиентскому контейнеру. Но опять же, зависит от того, как вы программируете, какого контейнера... Я надеюсь, что помог вам в вашем запросе.
Я предлагаю прочитать спецификацию J2EE: спецификацию JSR-000342 EE 7 И хорошую книгу для чтения об EJB: Enterprise JavaBeans 3.1, 6-е издание Эндрю Ли Рубингер, Билл Берк