20 concurrentHashMap 1.8

Posted cathy_mu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20 concurrentHashMap 1.8相关的知识,希望对你有一定的参考价值。

java7和java8差别

  • Java7 中 ConcurrentHashMap 使用的分段锁,也就是每一个 Segment 上同时只有一个线程可以操作,每一个 Segment 都是一个类似 HashMap 数组的结构,它可以扩容,它的冲突会转化为链表。但是 Segment 的个数一但初始化就不能改变。
  • Java8 中的 ConcurrentHashMap 使用的 Synchronized 锁加 CAS 的机制。结构也由 Java7 中的 Segment 数组 + HashEntry 数组 + 链表 进化成了 Node 数组 + 链表 / 红黑树,Node 是类似于一个 HashEntry 的结构。它的冲突再达到一定大小时会转化成红黑树,在冲突小于一定数量时又退回链表。

put

  • 根据 key 计算出 hashcode 。
  • 判断是否需要进行初始化。
  • 即为当前 key 定位出的 Node,如果为空表示当前位置可以写入数据,利用 CAS 尝试写入,失败则自旋保证成功。
  • 如当前位置的 hashcode == MOVED == -1,则需要进行扩容。
  • 如果都不满足,则利用 synchronized 锁写入数据。
  • 如果数量大于 TREEIFY_THRESHOLD 则要转换为红黑树。

get

  • 根据 hash 值计算位置。
  • 查找到指定位置,如果头节点就是要找的,直接返回它的 value.
  • 如果头节点 hash 值小于 0 ,说明正在扩容或者是红黑树,查找之。
  • 如果是链表,遍历查找之。

以上是关于20 concurrentHashMap 1.8的主要内容,如果未能解决你的问题,请参考以下文章

ConcurrentHashMap 源码浅析 1.8

ConcurrentHashMap -1.8 源码解析

1.7&1.8-ConcurrentHashMap对比

ConcurrentHashMap(1.8)分析

ConcurrentHashMap 1.7和1.8区别

ConcurrentHashMap1.7和1.8对比