https://javadoop.com/post/hashmap
Java7 HashMap
1)数据结构:数组 + 链表(拉链法)
2)put过程(使用头插法)
扩容过程:table[i] ---->newTable[i] + newTable[i + oldLength]
3)get过程
Java7 ConcurrentHashMap
1)数据结构:segment数组 + 数组 + 链表 (分段锁)
(可以认为是在Java7 HashMap上又套了一层segment数组)
2)put过程(使用头插法)
如何解决并发问题的?先找到对应segment后,获取独占锁,锁是使用的ReentrantLock
扩容过程:table[i]----->newTable[i] + newTable[i + oldLength]
(注意:segment数组没法扩容;无需考虑并发,因为此时持有独占锁)
3) get过程
Java8 HashMap
1)数据结构:数组 + 链表 + 红黑树
2)put过程(使用尾插法)
扩容过程:table[i]----->newTable[i] + newTable[i + oldLength]
3)get过程
Java8 ConcurrentHashMap
1)数据结构:数组 + 链表 + 红黑树
2)put过程(使用尾插法)
通过CAS + synchronized来实现并发控制
3)扩容过程:多线程协助扩容加快扩容速度(牛逼!!!)
多线程协助扩容的基本思想其实就是任务分解:table长度为n,则有n个迁移任务,将n个迁移任务均分给x个线程,每个线程负责n/x个迁移任务就可以了
4)get过程
5)并发控制:(牛逼,追求极致的性能!并发控制就是不用锁!)
为了减少损耗,尽量使用CAS + synchronized来实现并发控制,不使用Lock