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方法,