我们为什么要在多线程环境中使用HashMap?

ben*_*enz 4 java hashmap synchronized

今天我正在阅读HashMap如何在java中工作.我遇到了一个博客,我直接引用了博客的文章.我在Stackoverflow上看过这篇文章.我还想知道细节.

所以答案是肯定在Java中调整HashMap时存在潜在的竞争条件,如果两个线程同时发现现在HashMap需要调整大小并且他们都尝试调整大小.在Java中的HashMap的调整过程中,存储在链表斗元素有迁移到新的水桶中得到逆转,从而因为Java的HashMap不附加在尾部的新元素,而不是它在头部添加新元素避免尾部穿越.如果发生竞争条件,那么最终会出现无限循环.

它指出,由于HashMap在调整HashMap的大小调整期间不是线程安全的,因此可能会出现一个重要的竞争条件.我甚至在我们的办公室项目中看到,人们广泛使用HashMaps知道它们不是线程安全的.如果它不是线程安全的,那我们为什么要使用HashMap呢?是开发人员缺乏知识,因为他们可能不了解ConcurrentHashMap等结构或其他原因.任何人都可以解释这个难题.

sau*_*rav 8

我可以自信地说ConcurrentHashMap是一个非常被忽略的类.没有多少人知道它,也没有多少人关心它.该类提供了一种非常强大且快速的同步Map集合的方法.我在Web上阅读了一些HashMap和ConcurrentHashMap的比较.我只想说他们完全错了.你无法比较两者,一个提供访问地图的同步方法,而另一个提供无法同步.

我们大多数人没有注意到的是,虽然我们的应用程序,特别是Web应用程序在开发和测试阶段工作正常,但它们通常会在负载很重(甚至中等负载)下倾斜.这是因为我们希望我们的HashMap以某种方式运行,但在负载下它们通常是行为不端的.Hashtable提供对其条目的并发访问,只需要一个小警告,整个映射都被锁定以执行任何类型的操作.

虽然这种开销在正常负载下的Web应用程序中是可忽略的,但在负载很重的情况下,它可能导致响应时间延迟和服务器过载,这是没有充分理由的.这就是ConcurrentHashMap的步骤.它们提供了Hashtable的所有功能,其性能几乎与HashMap一样好.ConcurrentHashMap通过一种非常简单的机制实现了这一目标.

该集合默认维护一个包含16个锁的列表,而不是地图宽锁,每个锁用于保护(或锁定)地图的单个存储桶.这实际上意味着16个线程可以一次修改集合(只要它们都在不同的桶上工作).事实上,此集合没有执行锁定整个地图的操作.