Java Servlet生命周期由servlet容器管理。当第一个Web请求进入时,容器将加载Servlet类,调用其init方法,然后调用其服务方法来处理Web请求。它说只有一个servlet类的实例。容器创建多个线程并管理这些线程以处理多个Web请求(据我所知,这是我所知道的)。但我想了解,多个线程如何运行并处理多个同时的Web请求,因为只有一个servlet类实例。有人能说清楚这个吗?
答案 0 :(得分:17)
对象实例(的方法)可以由多个线程同时调用。这不是特定于servlet的,并且通常是正确的。
发生这种情况会发生什么?每个线程仍然有自己的堆栈,这意味着每个线程都有不同的局部变量副本可供使用。因此,线程之间不会产生干扰,您不必担心并发调用。仅在共享资源时,例如,访问实例/类变量,可能会出现问题。如果同时直接访问实例/类变量也是一样的。
相比之下,EJB完全符合您的建议。 EJB容器确保一次只有一个线程进入EJB实例,因此只要他/她不破坏EJB编程契约,EJB程序员就不必担心并发性。 servlet规范没有理由不这样做。在会议期间,很可能没有人提出这个问题?虽然您可以使用比EJB的“每个实例一个线程”更高效的并发管理,但它确实具有优势。答案 1 :(得分:4)
保护servlet不受并发调用的影响,直到初始化完成。完成此操作后,所有调用都会在您的servlet上同时执行。这意味着如果需要同时处理两个请求,则service
方法可以由两个并发线程调用。
如果此行为不适合您(例如,如果您使用某种非线程安全资源)并且确实不希望您的方法同时被多个线程调用,则可以标记您的service
方法为synchronized
。