[英]Will ConcurrentHashMap with concurrencyLevel as 1 work as HashMap
我创建了一个具有以下值的`ConcurrentHashMap:
ConcurrentHashMap<String,String> concurrentHashMap = new ConcurrentHashMap<>(10,.9F,1);
以上表示只有1个线程可以在给定的时间点更新地图。 如果是这种情况,那么我可以说它在并发的情况下将像HashMap
一样工作。 在给定的时间点仅执行一次写操作。
我的理解正确吗,或者我在这里缺少什么?
concurrencyLevel
只是一个提示,有助于调整内部数据结构的大小。 不能保证将使用的实际值是1
,并且如果不是从多个线程中实际使用它,则不是表现为常规的HashMap,这可能意味着效率较低。
从Javadoc:
使用比您需要的高得多的值会浪费空间和时间,而低得多的值会导致线程争用。
您的问题实际上是关于concurrencyLevel
:
concurrencyLevel-并发更新线程的估计数量。 该实现可以使用该值作为调整提示。
基本上, ConcurrentHashMap
被分块为段。 每个段一次只能被一个线程修改。 简而言之,您拥有的细分越多,您获得的并发性就越高。 但是,由于每个段都有其自己的内存开销,因此最终还会使用更多的内存。
因此,如果您知道只有一个线程将访问您的映射,则将concurrencyLevel
设置为1只会在映射中创建1个段,从而使其内存使用效率更高。
如果该值太大,将使用更多的内存,并且将花费一些时间为要在映射中读取/写入的每个对象找到正确的段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.