我正在编写一个需要在不同请求中维护一些内部状态的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如何从单个类创建许多线程。
答案 0 :(得分:2)
我的问题是,如果我编写这样的代码,那么
Map
(对于类static
)将在Tomcat创建的线程之间共享[?]
是。它将在(可能)多个线程之间共享。
我想我真正没有得到的是Tomcat如何从单个类创建许多线程。
线程与类无关。线程是一系列指令。它代表了代码的执行。
Tomcat会生成许多用于处理请求的线程。它将生成sessionManager
类的单个实例。所有线程都将使用此实例来处理请求。然后他们每个人都可以访问Map
字段。您需要应用自己的外部同步,以根据需要使其线程安全。
答案 1 :(得分:0)
与tomcat如何创建它们并不重要。也许new Thread(name)
。您真正要问的是不同线程可见的内容。了解更多谷歌的并发性,&#39;线程可见性&#39;,&#39; java内存模型&#39;或者&#39;发生之前&#39;。
在您的情况下,字段本身将对您的所有线程可见。但是对该字段的更改(将新地图指定给字段或更改地图内容)可能无法在线程之间传播。你需要使用并发机制来在线程之间进行通信(同步,易失,并发映射等等,最适合你)