当前位置: 首页 > 知识库问答 >
问题:

多线程环境中调整大小时的Hashmap

越学文
2023-03-14

我正在学习一个教程,它基本上解释了在多线程环境中调整Hashmap大小时出现争用条件的原因:

在Java中,如果两个线程同时发现现在HashMap需要调整大小,那么它们都尝试调整大小。Java HashMap在调整HashMap大小的过程中,链表中存储的bucket中的元素在迁移到新bucket时被颠倒,因为Java HashMap不在尾部追加新元素,而是在头部追加新元素,以避免尾部遍历。如果竞争条件发生,那么您将以无限循环结束

读到这里我有两个疑问:

  1. 为什么每个bucket的链表按顺序颠倒?
  2. 我可以看到可能有竞争条件,但看不出无限循环是怎么来的?是否因为一个线程可能会将元素从头到尾追加,而另一个线程则以相反的顺序进行追加?

请帮助我澄清这一点,非常感谢!

共有1个答案

辛意智
2023-03-14

你的第一个问题的答案在引用的文本中:

因为java HashMap不在尾部追加新元素,而是在头部追加新元素以避免尾部遍历

如果HashMap按插入顺序存储它们,它必须在每次插入时遍历列表,或者存储一个指向列表末尾的额外指针(并维护它)。无论如何,将元素按插入顺序存储在bucket中不会有任何好处(至少我想不出有什么好处)。

你的第二个问题的答案在这里:

http://mailinator.blogspot.hu/2009/06/Beaution-race-condition.html

 类似资料:
  • 问题内容: 我正在学习一个教程,它基本上解释了在多线程环境中调整Hashmap大小时发生争用情况的原因: 在Java中,如果同时发现两个线程,则HashMap需要调整大小,并且它们都尝试调整大小。在Java中调整HashMap的大小的过程中,存储在链表中的存储桶中的元素在迁移到新存储桶的过程中顺序颠倒,因为Java HashMap不会在尾部附加新元素,而是在头部附加新元素。避免横越尾巴。如果发生比

  • 我的应用程序中有如下工作流:可以有X个用户请求(通常同时有5-10个),他们希望在系统中搜索某些东西(每个请求在单独的线程中处理)。 每个搜索都可以并行处理(我目前正在实现)。线程/CPU使用实际上不是这里的问题,因为这些任务不需要占用CPU。数据库是瓶颈。 目前,我只为搜索机制设置了一个单独的DB连接池-最大池大小设置为10。我知道这不多,但我不能把它设置得更高。现在我试图弄清楚如何为每个搜索(

  • 问题内容: 我正在用d3.js绘制散点图。借助以下问题: 获取屏幕,当前网页和浏览器窗口的大小 我正在使用此答案: 这样我就可以将图适合用户的窗口,如下所示: 现在,我希望在用户调整窗口大小时可以调整图的大小。 PS:我的代码中没有使用jQuery。 问题答案: 寻找“响应式SVG”,使SVG响应式非常简单,您不必再担心大小。 这是我的做法: 注意: SVG图像中的所有内容都会随窗口宽度缩放。这包

  • 我的 Web 应用程序中出现随机错误,我迷路了。我创建了一个库来解码代码。我尝试了很多,从未失败过测试。但突然间,它开始随机失败。由于它在单线程测试中运行良好,有时在 servlet 环境中失败时,我能想象的唯一解释是问题与多线程环境中使用的库有关。老实说,我知道多线程是一个非常复杂的问题。我担心我的库可能不是线程安全的。顺便说一下,它非常简单,它是一个具有几种静态方法的正面类。基本上,假设您正在

  • 我在学习多线程时发现对象的速度变慢了。hashCode在多线程环境中,因为对于相同数量的对象,计算运行4个线程的默认哈希代码要比运行1个线程的默认哈希代码花费两倍的时间。 但根据我的理解,并行完成这项工作也需要类似的时间。 您可以更改线程数。每个线程都有相同的工作量,因此您希望在我的四核机器上运行4个线程可能需要与运行单个线程相同的时间。 我看到4x大约2.3秒,但是。1x为9秒。 我的理解是否有

  • 我正在尝试构建一个包含6个窗格(作为父级添加到GridPane布局中)的简单Java项目。我必须在开始时设置窗口大小,并通过参考根布局的宽度和高度,设法将它们均匀地拆分。 但我想要他们调整大小,因为我改变了窗口的大小(使用鼠标,现在他们得到固定的大小)。 下面是我的代码: