ConcurrentHashMap
ConcurrentHashMap
ConcurrentHashMap是线程安全的,效率较高。在JDK7和JDK8中,底层原理不一样。
ConcurrentHashMap1.7原理解析
- 会创建一个默认长度16,默认加载因子为0.75的数组,数组名Segment
- 再创建一个长度为2的小数组,把地址值给0索引,其他索引都是null
- 根据键的哈希值计算出Segment数组的索引
- 如果为空,就创建一个长度默认为2的数组
- 再次利用键的哈希值计算出在小数组应存入的索引(二次哈希)
- 如果为空,则直接添加
ConcurrentHashMap1.8版本原理解析
底层结构:哈希表。(数组、链表、红黑树的结合体)
结合CAS机制+synchronized同步代码块形式保证线程安全
总结
- 如果使用空参构造创建ConcurrentHashMap对象,则什么事情都不做,在第一次添加元素的时候创建哈希表
- 计算当前元素应存入的索引
- 如果该索引位置为null, 则利用cas算法,将本结点添加到数组中
- 如果给索引位置不为null, 则利用volatile关键字获得当前位置最新的结点地址,挂在下面,变成链表
- 当链表的长度大于等于8时,自动转换成红黑树
- 以链表或者红黑树结点为锁对象,配合synchronized保证多线程操作集合时数据的安全性。