【问题标题】:Towards understanding servlets and multi-threading了解 servlet 和多线程
【发布时间】:2012-01-16 20:00:52
【问题描述】:

所以我读到了这个很棒的帖子: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(..)

当只有 1 个实例时,多线程如何工作?这实际上并不特定于 servlet,我只是无法理解它是如何工作的。

假设网站上有 10 个并发用户同时访问同一个 servlet,这个实例在所有用户之间共享,为什么它不阻塞并以串行方式工作,它是如何做到的同时?

【问题讨论】:

标签: java multithreading servlets


【解决方案1】:

这不是特定于 Servlet。这是特定于 Java 的。 Java 语言和 VM supports 由多个线程调用单个方法。每个线程将只拥有自己的方法局部变量份额。如果你想限制这一点,你必须在方法中添加一个synchronized 锁,或者让servlet 实现(已弃用!)SingleThreadModel 接口。但是,如果您以线程安全的方式编写 servlet 方法(即不将请求/会话范围的数据分配为实例变量),则没有必要。

【讨论】:

  • 我明白了,多线程的关键点是虚拟机创建了一个实例,但每个调用这个共享实例的线程都会生成方法局部变量。还有更多吗?有任何链接可以进一步了解这一点吗?
  • 方法局部变量基本存储在线程中,不在实例中。当线程离开方法时,它们被丢弃。我将其回答为“每个线程将只拥有自己的方法局部变量份额”。检查我的答案中的“支持”链接。这是一本相当不错的读物,但这是您可以获得的有关内部运作的最佳权威解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2016-02-16
  • 2017-05-15
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
相关资源
最近更新 更多