自学内容网 自学内容网

ConcurrentHashMap源码解析

1.介绍一下ConcurrentHashMap?

concurrentHashMap是一个线程安全的集合,在HashMap基础上进行了优化,在JDK1.7中,ConcurrentHashMap由一个个的Segment组成,每个Segment就是一个类似于HashMap的结构,每个Segement可以单独上锁,因此ConcurrentHashMap的最大并发度就是segment的个数,当插入元素时候,要先获得segment锁。

构造方法有哪些?

无参构造方法ConcurrentHashMap()中调用有参构造方法,传入参数是初始容量,负载因子,默认并发级别16,然后会检验相关的传入的参数;检验并发级别的大小,如果大于2^16次方,则重置为2^16,否则会将并发级别变为最近的2的幂次方值,最后初始化segmet[0],默认为2

讲讲put方法?

首先计算Key的哈希值,通过哈希值定位到segment,然后通过tryLock()获取锁,再次通过哈希值定位到segment中的数组中位置,如果该位置的HashEntry不存在,如果HashEntry容量大于扩容阈值,并且小于最大阈值,那么进行扩容,然后通过头插入插入;如果该位置的HashEntry存在,那么比较该key和hash是否和put的key和hash是否一致,如果一致就替换,否则遍历下一个节点,如果都不一致,那么直接在链表头部插入,最后释放锁。

讲讲get方法?

首先计算key的哈希值,通过该hash值定位到Segment对象,再次通过hash值定位到Segment中HashEntry位置,然后遍历链表,找到相同的key的value。

JDK1.8的ConcurrentHashMap进行了哪些改进?

与JDK1.7相比,ConcurrentHashMap由Node数组,链表和红黑树组成,当链表长度达到8并且数组长度>=64,就会转换成红黑树。同时在JDK1.8中,不再是以Segment为锁,而是以链表或者红黑树的头节点为锁。

JDK1.8的put方法,


原文地址:https://blog.csdn.net/xuan__xia/article/details/135616654

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!