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
当多个线程更新同一个变量是,若内存值等于预期值则更新为新值,若不等于会告知线程修改值失败不会挂起,但是可以重试
下一篇:
java内存调优之jmap命令