Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hapshmap vs tomcat应用服务器_Java_Multithreading_Synchronization_Tomcat7 - Fatal编程技术网

Java Hapshmap vs tomcat应用服务器

Java Hapshmap vs tomcat应用服务器,java,multithreading,synchronization,tomcat7,Java,Multithreading,Synchronization,Tomcat7,我从采访中得到一个问题,您在当前项目中使用Hashmap还是Hashtable 我的回答:我说我使用的是Hashmap而不是Hashtable,因为它不是多线程环境(project没有多线程处理) 问:Tomcat为请求处理创建了多个线程,那么为什么要使用Hashmap呢 我的回答: 它将在中创建多个线程,每个线程都有自己的线程堆栈内存,用于保存这些对象和处理请求 是不是我的答案是正确的?如果不是,请纠正我这个问题的答案。这取决于上下文 如果您有一些在请求之间使用的共享数据结构,那么是的,您需要

我从采访中得到一个问题,您在当前项目中使用Hashmap还是Hashtable

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

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

我的回答:

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


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

这取决于上下文

如果您有一些在请求之间使用的共享数据结构,那么是的,您需要某种类型的同步。您可能需要考虑<代码> java .UTI.Orth.CONCURNESHASMAP 但是,它提供的竞争读取比<代码>哈希表 >低。 您是对的,但是如果您在请求内部创建结构,并且不在线程/请求之间共享它,那么
HashMap
就可以了

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

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

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


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

如果您不在线程之间共享映射,则您的HashMap是正确的。好的,谢谢您的评论。一个澄清-在webapplication中,多个用户请求另一个用户查看的一个用户hashmap数据?即使它是一个静态hashmap/变量,也有可能吗?谢谢您的时间并提供说明。请求之间的共享数据结构是什么意思?是Httpsession吗?还是应用程序上下文?你能详细说明一下吗。我们如何创建共享数据结构?我用一些更具体的例子来说明答案,但是一般来说,如果您在任何一个可以访问我的多个请求(例如应用程序上下文、会话上下文、任何静态对象)的位置上使用任何映射或列表类结构,则应该考虑使用线程安全的版本。这似乎是一个合理的解释:请记住,线程保存版本的性能不如标准版本,哈希表非常旧,具有糟糕的性能特征