0

可能是你听过的最愚蠢的问题。

在 Web 容器内部,如何创建/管理具有相同引用变量的同一个类的多个对象......让我用一个例子来解释一下。

在我的控制器类中,我有一个代码片段

AdminUser adminUser= new AdminUser();

因此,当 2 个管理员登录到我的 Web 应用程序时,将有 2 个 AdminUser 类的对象具有相同的引用变量“adminUser”

  1. 怎么可能,是2个不同的线程吗?
  2. 谁在管理这个线程,Web 容器?
  3. 如果是这样,Web 容器是如何做到的,它是用 threadLocal 包装应用程序代码吗?
  4. 如果它的不同线程,要维护一个全局对象(比如管理员访问计数的计数器),“静态”就不够了......它需要是“易失性”,对吗?
4

3 回答 3

1

因此,当 2 个管理员登录到我的 Web 应用程序时,将有 2 个 AdminUser 类的对象具有相同的引用变量“adminUser”

不。

如果那行代码在方法中,则变量在堆栈上,并且可以有与方法的并发调用一样多的实例,包括递归和多个线程的调用。

如果是非静态成员初始化代码,变量在对象中,有多少个对象就有多少个实例。

如果对象是 bean,则它们的数量取决于对象的范围:如果是应用程序,则为一个;如果是应用程序,则为一个;如果会话,每个会话一个;如果查看,则每次查看一个;等等

如果它是静态成员初始化代码,它不应该是。

怎么可能,是2个不同的线程吗?

看上面。

谁在管理这个线程,Web 容器?

是的,它还管理 bean 实例。

如果是这样,Web 容器是如何做到的,它是用 threadLocal 包装应用程序代码吗?

不,见上文。

如果它的不同线程,要维护一个全局对象(比如管理员访问计数的计数器),“静态”就不够了……它需要是“易失的”,对吗?

不可以。您可以将其作为应用程序范围 bean 的实例成员来维护。

除了常量和缓存之外,你应该在 web 应用程序中完全避免静态,你也应该避免。

于 2014-07-10T04:01:40.227 回答
0

有几个因素会影响回答您的问题,j2ee 有自己的规范,制造商必须遵循,而其他的,他们应该按照自己的意愿简单地实施。是给出他们想要的表现,或者他们在某些时刻应该如何行动。Jboss 肯定不同于 Apache Tomcat 性能问题,这使得您很难回答您的第一个问题。然后回答:“这取决于你说的是哪个供应商。具体是什么容器?” 这还取决于您是否在代码中实现 Enterprise JavaBean,因为那时可能会启动几个 Bean(对象)(取决于容器),并且来自客户端的每个请求他可能会共享这些 Bean 或创建新的 Bean 以应对竞争。

回答他们的第四个问题,我认为最好的方法是通过 Singleton Session Bean(EJB 实现)进行计数器。但是你可以通过一个静态类来做到这一点,所有其他对象都可以在其中共享,但必须解决对象之间的竞争。EJB 为您解决了这场竞争,而您不必为此浪费时间。EJB 的解决方案是针对这个和许多其他事情

我认为如果您不实现 EJB,并编写一个非常简单的代码,那么对于客户所做的每个请求,都会创建和销毁一个对象(不是真的,因为它依赖于 JVM 来销毁,垃圾收集,但它无法访问你)在将响应发送到客户端容器之后。但同样,取决于您如何编程,使用哪个容器......我希望我对您的询问有所帮助。

我建议阅读 J2EE 规范: JSR-000342 EE 7 Specification 还有一本关于 EJB 的好书:Enterprise JavaBeans 3.1, 6th Edition 作者 Andrew Lee Rubinger, Bill Burke

于 2014-07-10T02:54:03.260 回答
0

这就是我一直在寻找的答案。感谢所有回答的人。

应用程序服务器是否为来自同一用户的每个请求创建新线程?

Web 容器 (Tomcat) 为每个请求生成新线程(实际上,出于性能原因,它使用线程池)。

对于任何请求(不管是谁发出的),都会从池中获取一个线程,处理该请求,然后线程返回到池中。

于 2014-08-23T03:36:44.310 回答