所以我读了这篇很棒的帖子:Difference between each instance of servlet and each thread of servlet in servlets?
它说“servletcontainer为每个请求重用相同的servlet实例。”
所以我们假设我们有一个servlet:
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object thisIsThreadSafe;
thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
}
}
servlet容器也是如此,初始化时它将在内部调用:
MyServlet myServlet = new MyServlet(....);
然后当请求与web.xml中的内容匹配时,它将返回此实例myServlet。
我需要帮助理解的是,当致电:
myServlet.doGet(..)
当只有一个实例时,多线程如何工作?这不是特定于servlet的,我只是无法理解这是如何工作的。
假设网站上有10个并发用户在同一时间点击同一个servlet,这个实例在所有这些实例中共享,为什么它不会以串行方式阻塞和工作,它是如何做到这一点的同时?
答案 0 :(得分:7)
这不是特定于Servlets的。这是Java特有的。 Java语言和VM supports通过多个线程调用单个方法。每个线程都只有自己的方法局部变量。如果要限制此操作,则需要向方法添加synchronized
锁定或让servlet实现(不建议使用!)SingleThreadModel
接口。但是,如果以线程安全的方式编写servlet方法(即不将请求/会话作用域数据分配为实例变量),则不需要这样做。