我使用以下值创建了一个`ConcurrentHashMap:
ConcurrentHashMap<String,String> concurrentHashMap = new ConcurrentHashMap<>(10,.9F,1);
以上意味着只有1个线程可以在给定的时间点更新地图。如果是这种情况,那么我可以说在并发的情况下它将像HashMap
一样工作.i.e。;在给定的时间点只执行一次写操作。
我的理解是正确还是我在这里遗漏了什么?
答案 0 :(得分:2)
concurrencyLevel
只是一个提示,有助于调整内部数据结构的大小。没有保证1
将是使用的实际值,而不是表现为常规HashMap,它可能意味着如果您实际使用超过1个线程,它将使用效率较低。
来自Javadoc:
使用比您需要的值高得多的值可能会浪费空间和时间,而显着更低的值可能会导致线程争用。
答案 1 :(得分:1)
您的问题实际上是关于concurrencyLevel
:
concurrencyLevel - 并发更新线程的估计数量。实现可以将此值用作大小提示。
基本上,ConcurrentHashMap
被分成若干段。每个段只能一次修改一个线程。简而言之,您拥有的细分越多,获得的并发性就越高。然而,你最终也会使用更多的内存,因为每个段都有自己的内存开销。
因此,如果您知道只有一个线程可以访问您的地图,那么将concurrencyLevel
设置为1只会在地图中创建1个段,从而提高内存效率。
如果值太高,将使用更多内存,并且将使用一些时间为要在地图中读/写的每个对象找到正确的段。