ConcurrentHashMap,JDK8改进了哪些并发特性
ConcurrentHashMap, which concurrent features improved in JDK8
哪位并发高手能解释一下ConcurrentHashMap中的并发特性相比之前的JDK有哪些改进
嗯,ConcurrentHashMap
已经完全重写了。在 Java 8 之前,每个 ConcurrentHashMap
都有一个在构建时固定的“并发级别”。出于兼容性原因,仍然有一个 constructor accepting such a level 虽然没有以原始方式使用它。该地图被分成与其并发级别一样多的段,每个段都有自己的锁,因此理论上,如果全部发生,最多可以有 并发级别 并发更新针对不同的段,这取决于散列。
在 Java 8 中,每个哈希桶都可以单独更新,因此只要没有哈希冲突,就可以有与其当前容量一样多的并发更新。这符合 compute
方法等新功能,这些方法保证原子更新,因此,至少锁定被更新的哈希桶。在最好的情况下,他们确实只锁定了那个桶。
此外,ConcurrentHashMap
受益于应用于所有类型哈希映射的一般哈希改进。当某个桶存在哈希冲突时,该实现将求助于该桶内的排序映射类结构,从而在搜索桶.
我觉得和JDK7相比有几个变化:
- 延迟初始化:在JDK8中,只有当一些实体被添加到映射中时,才会分配用于每个段的内存。在 JDK7 中,这是在创建映射时完成的。
- JDK8 中添加了一些新功能,如 forEach、reduce、search 等。
- 内部结构变化:jdk8中使用了TreeBin(红黑树)来提高查找效率。
哪位并发高手能解释一下ConcurrentHashMap中的并发特性相比之前的JDK有哪些改进
嗯,ConcurrentHashMap
已经完全重写了。在 Java 8 之前,每个 ConcurrentHashMap
都有一个在构建时固定的“并发级别”。出于兼容性原因,仍然有一个 constructor accepting such a level 虽然没有以原始方式使用它。该地图被分成与其并发级别一样多的段,每个段都有自己的锁,因此理论上,如果全部发生,最多可以有 并发级别 并发更新针对不同的段,这取决于散列。
在 Java 8 中,每个哈希桶都可以单独更新,因此只要没有哈希冲突,就可以有与其当前容量一样多的并发更新。这符合 compute
方法等新功能,这些方法保证原子更新,因此,至少锁定被更新的哈希桶。在最好的情况下,他们确实只锁定了那个桶。
此外,ConcurrentHashMap
受益于应用于所有类型哈希映射的一般哈希改进。当某个桶存在哈希冲突时,该实现将求助于该桶内的排序映射类结构,从而在搜索桶.
我觉得和JDK7相比有几个变化:
- 延迟初始化:在JDK8中,只有当一些实体被添加到映射中时,才会分配用于每个段的内存。在 JDK7 中,这是在创建映射时完成的。
- JDK8 中添加了一些新功能,如 forEach、reduce、search 等。
- 内部结构变化:jdk8中使用了TreeBin(红黑树)来提高查找效率。