ConcurrentHashMap 源码分析

可以参考的资料:

JDK 1.7

//1.7 我觉得只需要稍微了解一下构成即可,不必详细了解

JDK 1.8

基本结构:

初始化:

ConcurrentHashMap 的初始化是通过自旋和 CAS 操作完成的。里面需要注意的是变量 sizeCtlsizeControl 的缩写),它的值决定着当前的初始化状态。

put

get

总结一下 get 过程:

总结:总的来说 ConcurrentHashMap 在 Java 8 中相对于 Java 7 来说变化还是挺大的

总结

Java 7 中 ConcurrentHashMap 使用的分段锁,也就是每一个 Segment 上同时只有一个线程可以操作,每一个 Segment 都是一个类似 HashMap 数组的结构,它可以扩容,它的冲突会转化为链表。但是 Segment 的个数一但初始化就不能改变。

Java 8 中的 ConcurrentHashMap 使用的 Synchronized 锁加 CAS 的机制。结构也由 Java 7 进化成了 Node 数组 + 链表 / 红黑树,Node 是类似于一个 HashEntry 的结构。它的冲突再达到一定大小时会转化成红黑树,在冲突小于一定数量时又退回链表。