java - hapshmap vs tomcat 应用服务器
问题描述
面试有一个问题,你现在的项目是用Hashmap还是Hashtable?
我的回答:我说我使用的是 Hashmap 而不是 Hashtable,因为它不是多线程环境(项目没有多线程处理)。
问:Tomcat 为请求处理创建了多个线程,那你为什么使用 Hashmap?
我的回答:
它将创建多个线程,每个线程都有自己的线程堆栈内存,用于保存这些对象并处理请求。
如果不是,我的回答是否正确,请纠正我这个问题的答案。
解决方案
这取决于上下文。
如果您有一些在请求之间使用的共享数据结构,那么是的,您需要某种同步。但是,您可能需要考虑 a java.util.concurrent.ConcurrentHashMap
,它提供比 a 更低争用的阅读Hashtable
。
你是对的,如果你在请求中创建结构,并且不在线程/请求之间共享它,aHashMap
就可以了。
只是为了充实这一点,回复评论:
想象一下,您正在编写一个接受键/值对数组的端点。如果这个endpoint重复需要根据key引用这些请求值,但是其他请求不需要这些值,你可能希望将它们放入一个HashMap中。如果服务器同时为同一端点提供 n 个并发请求,它将创建控制器的 n 个实例,每个实例都使用自己的堆栈(如您所指出的)和自己的 HashMap 副本执行该方法。重要的是,HashMap 的每个实例将永远不必处理来自多个线程的并发访问。
现在想象第二种情况,网站希望阻止用户过于频繁地尝试登录。您可以在应用程序上下文中使用字典,该字典存储每个用户登录活动的计数,以尝试查找帐户是否受到攻击(顺便说一下,这是说明性的 - 不要以这种方式实现此场景)。在这种情况下,n 个并发请求都将同时更新字典。如果多个线程同时尝试添加新键,这可能会终止应用程序。
您在下面的评论是指应用程序/会话上下文。会话仍然是共享的;即使它属于一个用户,该用户也可以向服务器发出多个并发请求,这些请求都会更新同一个 HashMap,例如他们的购物车
推荐阅读
- php - Laravel 批准的类别在同一张表中
- mysql - 如何从另一个表加入计数(*)
- angular - 角度测试 - 如果包含在 whenStable 中,则预计不会出现
- angular - Angular 材质:弹出窗口:允许在原始窗口中单击并且不要灰显
- mysql - 将 MySQL 工作台连接到 MS ODBC
- http - Flutter:构建内部的 setState
- .net - 如何使用 NuGet 打包单个 EXE
- windows - 如何提交对 Windows 容器的更改,包括 PATH 等环境变量?
- r - r data.table 如何从不同的 data.table 进行查找
- sql - 带外连接的长查询,