ConcurrentHashMap 的数据结构
ConcurrentHashMap它是线程安全版的HashMap。
JDK 1.7
-
ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成。
-
主要实现原理是实现了锁分离的思路,采用分段锁的机制,实现并发的更新操作。
-
底层采用数组+链表的存储结构,包括两个核心静态内部类Segment和HashEntry
-
Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,也就是上面的提到的锁分离技术。
-
每一个Segment元素存储的是HashEntry数组+链表(若干个桶),这个和HashMap的数据存储结构一样。
-
HashEntry用来封装映射表的键值对
-
每个桶是由若干个HashEntry对象链接起来的链表
JDK 1.8
-
取消Segment类,直接用table数组存储键值对。
-
采用Node + CAS + Synchronized来保证并发安全。
-
Node数据结构很简单,就是一个链表,但是只允许对数据进行查找,不允许进行修改
-
CAS:关注于三个量,内存的地址 V 期望(你认为)的原值 A 新值B
-
当HashEntry对象组成的链表长度超过8时,或数组长度小于64 就会扩容,否则链表转换为红黑树,提升性能。底层变更为数组+链表+红黑树。