了解servlet和多线程

cod*_*ing 2 java multithreading servlets

所以我读了这个很棒的线程:servlet的每个实例和servlet中每个servlet线程之间的区别?

它说"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.
    } 
}
Run Code Online (Sandbox Code Playgroud)

servlet容器初始化时也会在内部调用:

MyServlet myServlet = new MyServlet(....);
Run Code Online (Sandbox Code Playgroud)

然后,当请求与web.xml中的内容匹配时,它将返回此实例myServlet.

我需要帮助理解的是,当致电:

myServlet.doGet(..)
Run Code Online (Sandbox Code Playgroud)

当只有一个实例时,多线程如何工作?这不是特定于servlet的,我只是不能理解这是如何工作的.

假设网站上有10个并发用户在同一时间点击同一个servlet,这个实例在所有这些实例中共享,为什么它不会以串行方式阻塞和工作,它是如何同时执行此操作的呢?

Bal*_*usC 7

这不是Servlets特有的.这是Java特有的.Java语言和VM 支持通过多个线程调用单个方法.每个线程都只有自己的方法局部变量.如果要限制它,则synchronized需要为方法添加锁定或让servlet实现(不建议使用!)SingleThreadModel接口.但是,如果以线程安全方式编写servlet方法(即不将请求/会话范围数据分配为实例变量),则不需要这样做.