一、HashMap
1、JDK7
- 数组+单向链表
- 头插法存在死循环bug
2、JDK8
- 数组+单向链表+红黑树
- 尾插法
3、HashMap头插法死循环问题
可以参考如下文章:《HashMap头插法为什么会出现死循环 产生循环链表的影响是什么》
二、ConcurrentHashMap
1、JDK7
分段锁,每个Segment有独立的锁,Segment实现了ReentrantLock,也就带有锁的功能。
1、分为16个Segment(相当于HashTable)
2、对每一个小的Segment加锁,使用ReentrantLock上锁
3、根据index存放在哪个Segment
4、get时候计算存放到那个Segment里面
2、JDK8
CAS+synchronized
CAS:new 出一个新的节点的时候,使用CAS无锁机制创建Node保证线程安全
synchronized:计算index产生冲突,使用synchronized锁住一个Node节点,更加精细,效率更高。