ConcurrentHashMap
看ConcurrentHashMap,需要先了解HashMap
ConcurrentHashMap和HashMap相同的地方:
- 数组长度都是2的n次幂
- Node结构都相同
- hash值都是原hash值高低位异或的结果
ConcurrentHashMap和HashMap不同的地方:
- 数组初始长度:带容量c造器下,Concurrent要运算 c*1.5+1,可避免扩容
- key不能为空
- ConcurrentHashMap的hash值的符号位一定是0,拒绝负数
- 负载因子只有在构造器中有用,实际扩容时,会用0.75(n-n>>2)
ConcurrentHashMap和HashTable的区别:
-
HashTable只有一把锁,所有线程都需要竞争这一把锁
-
ConcurrentHashMap是按桶位来锁,有效避免了多个线程竞争锁的问题
存储结构:
同HashMap
关键字段:
-
sizeCtl
- sizeCtl<-1时, 高16位是扩容标识戳,低16位= n + 1,n是正在进行扩容的线程数
- sizeCtl== -1, 正在进行初始化
- sizeCtl==0,数组尚未初始化,下一个数组长度是16
- sizeCtl>0