将concurrencyLevel为1的ConcurrentHashMap用作HashMap

时间:2014-06-30 09:53:26

标签: java

我使用以下值创建了一个`ConcurrentHashMap:

ConcurrentHashMap<String,String> concurrentHashMap = new ConcurrentHashMap<>(10,.9F,1);

以上意味着只有1个线程可以在给定的时间点更新地图。如果是这种情况,那么我可以说在并发的情况下它将像HashMap一样工作.i.e。;在给定的时间点只执行一次写操作。

我的理解是正确还是我在这里遗漏了什么?

2 个答案:

答案 0 :(得分:2)

concurrencyLevel只是一个提示,有助于调整内部数据结构的大小。没有保证1将是使用的实际值,而不是表现为常规HashMap,它可能意味着如果您实际使用超过1个线程,它将使用效率较低。

来自Javadoc:

  

使用比您需要的值高得多的值可能会浪费空间和时间,而显着更低的值可能会导致线程争用。

答案 1 :(得分:1)

您的问题实际上是关于concurrencyLevel

  

concurrencyLevel - 并发更新线程的估计数量。实现可以将此值用作大小提示。

基本上,ConcurrentHashMap被分成若干段。每个段只能一次修改一个线程。简而言之,您拥有的细分越多,获得的并发性就越高。然而,你最终也会使用更多的内存,因为每个段都有自己的内存开销。

因此,如果您知道只有一个线程可以访问您的地图,那么将concurrencyLevel设置为1只会在地图中创建1个段,从而提高内存效率。

如果值太高,将使用更多内存,并且将使用一些时间为要在地图中读/写的每个对象找到正确的段。