Tomcat 如何在内部创建线程?

How does Tomcat create threads internally?

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

创建的线程之间共享
public class sessionManager extends HttpServlet {
    private static HashMap<Integer, String> Map;

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

我想我真正不明白的是 Tomcat 如何从单个 class[= 创建许多 线程 20=]。

My question is, if I write code like this, will Map (which is static to the class) be shared between threads created by Tomcat[?]

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

I guess what I really don't get is how does Tomcat create many threads from a single class.

线程与 classes 没有关联。线程是一系列指令。它代表您的代码的执行。

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

tomcat 如何创建它们并不重要。也许 new Thread(name)。您真正要问的是不同线程可见的内容。了解更多 google 'concurrency'、'thread visibility'、'java memory model' 或 'Happened-before'。

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