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,阐明正在扩容或者是红黑树,查找之。
- 如果是链表,遍历查找之。