高并发之JUC---ConcurrentMap(并发映射)

1.概述

  1. ConcurrentMap是JDK1.5提供的一套用于应对并发且能保证线程安全的一套映射机制
  2. ConcurrentMap主要包含2部分内容:ConcurrentHashMap和ConcurrentNavigableMap

2.ConcurrentHashMap - 并发哈希映射

  1. 底层是基于数组+链表结构来进行存储,数组的每一个位置都称之为是一个桶,每一个桶中维系一个链表
  2. 数组默认初始容量是16,默认加载因子是0.75,每次扩容(桶数)默认增加一倍
  3. ConcurrentHashMap的最大桶数是2的30次方
  4. ConcurrentHashMap的桶数一定是2n的形式
  5. 在JDK1.8中,ConcurrentHashMap引入了红黑树机制。当桶中的元素个数达到8个的时候,那么这个桶中的链表扭转成一棵红黑树;如果桶中的元素个数不足7个的时候,这个桶中的红黑树扭转回链表 - 树化的最小容量为64,即桶数需要达到至少64个桶( 桶越少,越容易扩容)

3.代码示例,源码分析

如下代码创建了一个指定容量为12的并发映射

    public static void main(String[] args) {

        // 指定容量是12,实际容量是32
        // 指定容量是20,实际容量是32
        ConcurrentHashMap map =
                new ConcurrentHashMap<>(12);

    }

在源码中找到对应的构造器

因为输入的值是12 ,最终会进入到tableSizeFor()方法,经过计算该方法中得到的值是19

12+(12>>>1)+1  = 12+12/2 +1 =19

高并发之JUC---ConcurrentMap(并发映射)_第1张图片

tableSizeFor方法传入19

高并发之JUC---ConcurrentMap(并发映射)_第2张图片

 MAXIMUM_CAPACITY 的值如下:MAXIMUM_CAPACITY >>> 1  = 2^29

  private static final int MAXIMUM_CAPACITY = 1 << 30;

tableSizeFor (19)
int n = 19-1 
18 |=18/2^1

....

最终return的值是32,所以指定容量是12,实际容量是32

 

补充:为运算的方法

1.左移运算符
左移运算符用“<<”表示,是将运算符左边的对象,向左移动运算符右边指定的位数,并且在低位补零。其实,向左移n 位,就相当于乘上2 的n 次方

2.右移运算符
右移运算符用符号“>>>”表示,是将运算符左边的对象向右移动运算符右边指定的位数,并且在高位补0,其实右移n 位,就相当于除上2 的n 次方

3.带符号的右移运算符
带符号的右移运算符用符号“>>”表示,是将运算符左边的运算对象,向右移动运算符右边指定的位数。如果是正数,在高位补零,如果是负数,则在高位补1

 

n |= n >>> 1;    -------是将n值与等号右边的值进行或运算,运算结果给n

你可能感兴趣的:(高并发,ConcurrentMap)