Hapshmap 与 tomcat 应用服务器

Hapshmap vs tomcat app server

面试问了一个问题,你现在项目中用的是Hashmap还是Hashtable?

我的回答:我说我用的是Hashmap而不是Hashtable,因为它不是多线程环境(项目没有多线程处理)。

问:Tomcat 为请求处理创建了多个线程,那你为什么要使用 Hashmap?

我的回答:

它将创建多个线程,每个线程都有自己的线程堆栈内存,用于保存这些对象和处理请求。

我的回答是否正确,如果不正确,请纠正我这个问题的答案。

这取决于上下文。

如果您有一些在请求之间使用的共享数据结构,那么是的,您需要某种同步。但是,您可能需要考虑 java.util.concurrent.ConcurrentHashMap,它提供的阅读比 Hashtable 低。

你是对的,如果你在请求中创建结构,并且不在线程/请求之间共享它,HashMap 就可以了。

为了充实这一点,回复评论:

假设您正在编写一个接受 key/value 对数组的端点。如果此端点需要根据键重复引用这些请求值,但任何 other 请求都不需要这些值,您可能希望将它们放入 HashMap 中。如果服务器同时为同一端点提供 n 个并发请求,它将创建控制器的 n 个实例,每个实例都使用自己的堆栈(如您所指出的)和自己的 HashMap 副本执行该方法。重要的是,HashMap 的每个实例将永远不必处理来自多个线程的并发访问。

现在想象第二种情况,网站想要阻止用户过于频繁地尝试登录。您可以在应用程序上下文中使用字典,它存储每个用户的登录计数 activity 以尝试查找帐户是否受到攻击(顺便说一句,这是说明性的 - 不要以这种方式实现这种情况).在这种情况下,n 个并发请求将同时更新字典。如果多个线程同时尝试添加新密钥,这可能会终止应用程序。

您在下面的评论涉及应用程序/会话上下文。会话仍然是共享的;即使它属于一个用户,该用户也可以向服务器发出多个并发请求,这些请求都更新同一个 HashMap,例如他们的购物车