1.多线程环境使用哈希表
HashMap 不行,线程不安全
更靠谱的,Hashtable,在关键方法上加了synchronized
后来标准库又引入了一个更好的解决方案;ConcurrentHashMap
2.HashMap
- 首先HashMap本身线程不安全
- 其次HashMap的key值可以为空(当key为空时,哈希会被赋值为0)
3.Hashtable
这相当于直接针对Hashtable对象本身加锁
如果访问同一个Hashtable就直接造成锁冲突
size属性也是通过synchronized来控制同步,也是比较慢的
一旦触发扩容,就由该线程完成整个扩容工作,这个过程会涉及大量的元素拷贝,效率会非常低
4.ConcurrentHashMap
改进
1)缩小了锁的粒度
2)充分的使用CAS原子操作,减少一些加锁
3)优化了扩容⽅式:化整为零
◦ 发现需要扩容的线程,只需要创建⼀个新的数组,同时只搬⼏个元素过去.
◦ 扩容期间,新⽼数组同时存在.
◦ 后续每个来操作ConcurrentHashMap的线程,都会参与搬家的过程.每个操作负责搬运⼀⼩部
分元素.
◦ 搬完最后⼀个元素再把⽼数组删掉.
◦ 这个期间,插⼊只往新数组加.
◦ 这个期间,查找需要同时查新数组和⽼数组
注;
HashMap 的扩容操作是一把梭 在某一次插入元素操作中,整体完成扩容
ConcurrentHashMap 则是每次操作都只搬运一部分元素