并发hashmap size()方法的复杂性

Kar*_*ter 3 java concurrency concurrenthashmap java.util.concurrent

我想知道size()调用ConcurrentHashMapsize()方法是否与通常的HashMap方法具有相同的复杂性.

Mar*_*son 6

新实施的ConcurrentHashMap.size()JDK 8采用的是酷的算法,他们那种从复制粘贴LongAdder.

实际上,复杂性ConcurrentHashMap.size()几乎是恒定的(书呆子语言中的"O(1)"),与实际成本相比HashMap.size()可以忽略不计.不相信我?打开我的基本测试项目并自己运行.我没有在我当前的机器上安装JDK 7,与Java 1.8相比,使用Java 1.7获得时间成本反馈会很酷.


NPE*_*NPE 5

事实并非如此.在我的JDK版本中,HashMap.size()具有O(1)复杂性,而ConcurrentHashMap.size() 在最好的情况下必须迭代段.在最坏的情况下,它将锁定所有段,这在多线程场景中可能是相当昂贵的操作.

当然,哪个更快是一个完全不同的问题.答案在很大程度上取决于访问地图的线程数量,以及它们正在做什么.


And*_*s_D 5

size()on 的复杂性HashMapO(1)因为大小存储在字段中.如果我们看一下size()on 的实现ConcurrentHashMap,我们看,它更大(> O(1))

参考(openjdk-6)