并发——ConcurrentHashMap1.7 原理分析

本文详细解析了ConcurrentHashMap1.7的成员、内部类和方法,特别是构造方法、put()、remove()操作。ConcurrentHashMap通过Segment分段锁实现高并发,每个Segment继承自ReentrantLock,保证了线程安全。在put()过程中,采用自旋锁优化并发性能,而get()方法利用CAS保证了一定程度的并发安全性,但可能存在一致性问题。
摘要由CSDN通过智能技术生成


这篇文章仅分析ConcurrentHashMap 的安全性和并发性,hashMap的原理看java系列中的另一篇。

1. 成员

在这里插入图片描述
对比hashMap 和Concurrentmap 可以发现后者多了一个关键的对象Segment和一些该对象相关的属性

2.内部类

在这里插入图片描述
Concurrenthashmap 1.7 和hashmap的内部类相比,多出来了一个Segment 内部类,线程安全且高性能的实现多半和这个有关。

在这里插入图片描述
发现在Segment 中 继承了ReentrantLock 类,知道了这里使用的是加锁的方式来保证每个Segment操作的安全性,并且这个锁是加载每个Segment 上的

  • Segment
    在这里插入图片描述
    Segment 内部维护了一个HashEntry 哈希表,还有一些维护哈希表的属性。

3. 方法

3. 1 构造方法

这里看默认的实现
ConcurrentHashMap
在这里插入图片描述
hashmap
在这里插入图片描述
concurrentHashMap 中多了一个并发级别的设置,默认是16

    public ConcurrentHashMap(int initialCapacity,
                             float loadFactor, int concurrencyLevel) {
   
        if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0)
            throw new IllegalArgumentException();
        if (concurrencyLevel > MAX_SEGMENTS)
            concurrencyLevel = MAX_SEGMENTS;
        // Find power-of-two sizes best matching arguments
        int sshift = 0;
        int ssize = 1;
        while (ssize < concurrencyLevel) {
   
            ++sshift;
            ssize <<= 1;
        }
        this.segmentShift = 32 - sshift;
        this.segmentMask = ssize - 1;
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        int c = initialCapacity / ssize;
        if (c * ssize < initialCapacity)
            ++c;
        int cap = MIN_SEGMENT_TABLE_CAPACITY;
        while (cap < c)
            cap <<= 1;
        // create segments and segments[0]
        Segment<K,V> s0 =
            new Segment<K,V>(loadFactor, (int)(cap * loadFactor),
                             (HashEntry<K,V>[])new HashEntry[cap]);
        Segment<K,V>[] ss = (Segment<K,V>[])new Segment[ssize];
        UNSAFE.putOrderedObject(ss, SBASE, s0)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值