线程安全的 Map (concurrentHashMap)的实现原理

jdk1.7中采用 Segment + HashEntry的方式进行实现,结构如下:


image.png

Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,而每一个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构一样

而jdk1.8中则
去除 Segment + HashEntry + Unsafe 的实现,
改为 Synchronized + CAS + Node + Unsafe 的实现


image.png

如上图所示,取消了Segment字段,数组中存储的就是Node。它与HashMap中的HashEntry定义很相似,但是有一些差别。它对value和next属性设置了volatile同步锁,它不允许调用setValue方法直接改变Node的value域。
另外,将原先table数组+单向链表的数据结构,变更为table数组+单向链表+红黑树的结构,在hash碰撞过多的情况下会将链表转化成红黑树。

你可能感兴趣的:(线程安全的 Map (concurrentHashMap)的实现原理)