【发布时间】:2016-08-02 23:36:00
【问题描述】:
哪位并发高手能解释一下ConcurrentHashMap,哪些并发特性相比之前的JDK有所改进
【问题讨论】:
标签: concurrency java-8 concurrenthashmap
哪位并发高手能解释一下ConcurrentHashMap,哪些并发特性相比之前的JDK有所改进
【问题讨论】:
标签: concurrency java-8 concurrenthashmap
我认为与JDK7相比有几个变化:
【讨论】:
嗯,ConcurrentHashMap 已完全重写。在 Java 8 之前,每个 ConcurrentHashMap 都有一个“并发级别”,该级别在构建时固定。出于兼容性原因,仍然有一个constructor accepting such a level,尽管没有以原始方式使用它。该映射被分成与其并发级别一样多的段,每个段都有自己的锁,因此理论上,如果它们都针对不同的目标,则可以有高达 并发级别 的并发更新段,这取决于散列。
在 Java 8 中,每个哈希桶都可以单独更新,因此只要没有哈希冲突,就可以有与其当前容量一样多的并发更新。这与保证原子更新的compute 方法等新功能一致,因此,至少锁定了更新的哈希桶。在最好的情况下,它们确实只锁定了一个桶。
此外,ConcurrentHashMap 受益于适用于所有类型哈希映射的一般哈希改进。当某个桶发生哈希冲突时,该实现将求助于该桶内的排序映射结构,因此在搜索桶时会降低到O(log(n)) 复杂度,而不是旧实现的O(n) 复杂度。
【讨论】:
ConcurrentHashMap,您最终将获得巨大的开销,可能从未使用过。
size() 返回,无论它曾经多么精确。分段设计是使用Lock 实例来控制访问的想法的结果,以避免每个桶有一个Lock 的开销。新设计结合了无锁算法和synchronized。