简单回顾下hashmap的数据结构,具体底层的数据结构目前理解的还不是很透彻,本篇只做为本人笔记,仅供参考,本人数据结构 基础很弱,后续领悟透彻,继续完善。
1.jdk8对HashMap 做了优化,
jdk7的结构是 数组+链表,
jdk8 是数组+链表+红黑树,
复制代码
jdk1.7 concurrenthashmap概述
1.写操作时,通过锁分段,提高效率,理想状态下,可以支持16个线程执行并发写操作,以及任意数量的读操作。
复制代码
2.下图是conurrenthashmap的结构:本质是一个segment数组,总的来说,通过以下3个方面来保证高效性
.通过锁分段保证并发环境下的写操作
.通过HashEntry的不变性,volatile变量的内存可见性和加锁重读机制保证高效安全的读操作
.通过不加锁和加锁两种方案控制跨段操作的的安全性。
复制代码
3.concurrentHashMap分析
1.包含两个核心静态内部类 segment,HashEntry
2.segment 继承 ReentrantLock ,充当锁的角色,每个sgement对象守护每个散列映射表的若干个桶。
3.HashEntry用来封装 K/V对。
4.每个桶是由若干个 HashEntry 对象链接起来的链表。
复制代码
jdk1.8 concurrentHashMap分析
1. 1.8的实现已经抛弃了Segment分段锁机制,利用CAS+Synchronized来保证并发更新的安全,底层采用数组+链表+红黑树的存储结构
2. Z c 复制代码