【发布时间】:2013-07-27 16:08:57
【问题描述】:
今天我正在阅读有关 HashMap 在 Java 中的工作原理。我遇到了一个博客,我直接引用了博客的文章。我已经阅读了关于 Stackoverflow 的 this 文章。仍然 我想知道细节。
所以答案是肯定的,存在潜在的竞争条件,而 在Java中调整HashMap的大小,如果两个线程同时发现 现在 HashMap 需要调整大小,他们都尝试调整大小。在 Java中HashMap的大小调整过程,bucket中的元素 存储在链表中,在迁移期间按顺序颠倒 到新存储桶,因为 java HashMap 不会将新元素附加到 tail 而是在头部附加新元素以避免尾部遍历。 如果发生竞态条件,那么您将最终陷入无限循环。
它指出,由于 HashMap 在调整 HashMap 大小期间不是线程安全的,因此存在潜在的竞争 情况可能发生。我什至在我们的办公项目中看到,人们广泛使用 HashMaps 知道它们不是线程安全的。如果不是线程安全的,为什么要使用HashMap 然后?是否只是开发人员缺乏知识,因为他们可能不了解 ConcurrentHashMap 之类的结构或其他原因。谁能解释一下这个谜题。
【问题讨论】:
-
使结构线程安全需要额外的运行时工作(CPU 周期)。因此,如果线程安全不是问题,
HashMap效率更高 -
如果是共享的话不是一个好选择,但是如果限制在单线程上也没问题...两种情况都有用例...
-
如果你能保证对那个
HashMap的单线程访问,你就可以安全地使用它。否则,开始问自己问题...
标签: java hashmap synchronized