Tomcat如何在内部创建线程?

时间:2015-02-27 23:55:39

标签: java multithreading tomcat thread-safety

我正在编写一个需要在不同请求中维护一些内部状态的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如何从单个创建许多线程

2 个答案:

答案 0 :(得分:2)

  

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

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

  

我想我真正没有得到的是Tomcat如何从单个类创建许多线程。

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

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

答案 1 :(得分:0)

与tomcat如何创建它们并不重要。也许new Thread(name)。您真正要问的是不同线程可见的内容。了解更多谷歌的并发性,&#39;线程可见性&#39;,&#39; java内存模型&#39;或者&#39;发生之前&#39;。

在您的情况下,字段本身将对您的所有线程可见。但是对该字段的更改(将新地图指定给字段或更改地图内容)可能无法在线程之间传播。你需要使用并发机制来在线程之间进行通信(同步,易失,并发映射等等,最适合你)