简单了解 ConcurrentHashMap 在 JDK7 和 JDK8 中的区别

在了解 HashMap 的的原理时,对于 jdk7 和 8 的实现是不同的,同样,对于支持并发的 ConcurrentHashMap 来说其实现也不相同。

其主要区别在于两者保证线程安全的机制不同,jdk7 采用的是分段锁的概念,每一个分段都有一把锁,锁内存储的着数据,锁的个数在初始化之后不能扩容。

而 jdk8 的 ConcurrentHashMap 数据结构同 HashMap,通过 Synchronized+CAS 来保证其线程安全。

jdk7

在 jdk7 中,有一个非常重要的概念就是 Segment,实际上我们发现,同 HashMap 的设计一样,它也是用来存储数据的一个变量。

/**
 * The segments, each of which is a specialized hash table.
 * 表示 每一段都是一个hash表
 */
final Segment<K,V>[] segments;

Segment 这个内部类中,有一个 table 变量,在 HashMap 中存储数据也是叫 table 的变量。

image-20220120104609604

这里叫 HashEntry,而 HashMap 中就叫 Entry,其内部成员变量都大致相同,HashEntry 如下:

static final class HashEntry<K,V> {
   
    final int hash;
    final K key;
    volatile V value;
    volatile HashEntry<K,V> next;
    HashEntry(int hash, K key, V value, HashEntry<K,V> next) {
   
        this.hash = hash;
        this.key = key;
        this
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪了个王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值