在Tomcat中创建线程安全HashMap的最佳方法是什么?我将在加载应用程序时在InitServlet上创建ConcurrentHashMap。
(<load-on-startup>1</load-on-startup>)
来自不同线程的请求将读取和写入我的ConcurrentHashMap数据。 我不擅长多线程,所以不确定它是否接近正确?
放置这个HashMap的最佳位置应该放在哪里?
谢谢
答案 0 :(得分:4)
请勿将其设为静态 - 通过ServletContext
将其放入ctx.setAttribute("mapAttrKey", map)
。否则没关系。但是,做这样的事情并不常见,所以请分享你的用例 - 可能有更合适的解决方案。
答案 1 :(得分:3)
如果“initServlet”除了webapplication初始化之外什么也不做,那么你宁愿选择ServletContextListenrer
。这是一个启动示例:
public class Config implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
// Do stuff during webapp's startup.
}
public void contextDestroyed(ServletContextEvent event) {
// Do stuff during webapp's shutdown.
}
}
在web.xml
注册,如下所示:
<listener>
<listener-class>com.example.Config</listener-class>
</listener>
就是这样。您可以将Map
保留为实例变量和/或将其存储在ServletContext
(应用程序范围)中。