首页 > 解决方案 > hapshmap vs tomcat 应用服务器

问题描述

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

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

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

我的回答:

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

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

标签: javamultithreadingsynchronizationtomcat7

解决方案


这取决于上下文。

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

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

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

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

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

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


推荐阅读