【问题标题】:How does Tomcat create threads internally?Tomcat如何在内部创建线程?
【发布时间】:2015-04-30 19:55:01
【问题描述】:

我正在编写一个 Tomcat 应用程序,它需要跨不同请求维护一些内部状态,所以我需要在 Tomcat 创建的不同线程之间共享一些东西。我的问题是,如果我编写这样的代码,Map(即类的static)是否会在 Tomcat 创建的线程之间共享。

public class sessionManager extends HttpServlet {
    private static HashMap<Integer, String> Map;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // logic
    }
}

我想我真正不明白的是 Tomcat 如何从单个 创建许多 线程

【问题讨论】:

  • @DaveNewton 我什至不知道什么是应用程序范围?

标签: java multithreading tomcat thread-safety


【解决方案1】:

tomcat 如何创建它们并不重要。也许new Thread(name)。您真正要问的是不同线程可见的内容。了解更多关于“并发”、“线程可见性”、“java 内存模型”或“Happened-before”的谷歌。

在您的情况下,该字段本身将对您的所有线程可见。但是对该字段的更改(将新映射分配给该字段或映射内容的更改)可能不会在线程之间传播。您需要使用并发机制在线程之间进行通信(同步、易失、并发映射等任何最适合您的)

【讨论】:

  • 好点。实际上我问的是Tomcat在产生线程时是否创建了一个新实例。 Sotirios 对此的回答非常清楚。
【解决方案2】:

我的问题是,如果我编写这样的代码,Map(即类的static)是否会在 Tomcat 创建的线程之间共享[?]

是的。它将在(可能)多个线程之间共享。

我想我真正不明白的是 Tomcat 如何从一个类中创建多个线程。

线程与类无关。线程是一系列指令。它代表您的代码的执行。

Tomcat 产生了许多用于处理请求的线程。它将生成您的 sessionManager 类的单个实例。所有线程都将使用此实例来处理请求。然后他们每个人都可以访问Map 字段。您需要根据需要应用自己的外部同步以使其线程安全。

【讨论】:

  • 好的,我明白了。相当清楚。您能否指出有关它将生成您的sessionManager 类的单个实例 的参考?
  • @bl4ck5un 请参阅Servlet Specification 的第 2.2 章。
猜你喜欢
  • 2016-05-21
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多