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