Java7、8中的HashMap、ConcurrentHashMap学习总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值