concurrentHashMap1.7和concurrentHashMap1.8区别

底层

1.7底层是由ReentrantLock+Segment(锁,内部也维护了一个Entry数组)+HashEntry数组实现的,锁的颗粒度为Segment

1.8底层是由Node数组 + 链表+ 红黑树,并发操作使用的是Synchronized和CAS来控制,锁的颗粒度为HashEntry

PUT方法

1.7会进行两次定位,先进行Segment定位再对其内部的Entry数组进行定位,定位后使用自旋锁进行加锁当自旋64次时进行膨胀,膨胀后线程进入阻塞状态,等待唤醒。整个put时都持有锁

1.8只需要进行一次定位,使用synchronized+CAS机制,如对应下标没有节点,说明没有hash碰撞,使用cas进行插入,若成功则返回成功,失败则通过synchronized进行加锁

size计算方式

1.7先不加锁进行统计,最多统计三次,当前后两次值一样则返回,不一样则对每一个Segment进行加锁统计

1.8会维护一个baseCount属性,每次put后会通过cas进行对baseCount自增

红黑树

使用红黑树降低了哈希冲突的时间复杂度

CAS

当多个线程更新同一个变量是,若内存值等于预期值则更新为新值,若不等于会告知线程修改值失败不会挂起,但是可以重试

经验分享 程序员 微信小程序 职场和发展