sizeCtl
- 负数代表正在进行初始化或扩容操作
- 1代表正在初始化
- N 表示有N-1个线程正在进行扩容操作
- 0代表hash表还没有被初始化
- 正数值始终是当前ConcurrentHashMap容量的0.75倍,这与loadfactor是对应的
CAS同步操作
- 获取值
- 设置值(CAS、voliate)
get
与hashmap相同,不控制读的同步
put
- 如果当前结点为forwarding则帮助扩容
- 如果非forwarding且非null则加锁
resize
- 如果元素是null,则变为forwarding
- 如果元素不为null,则加锁,移动至newTable,处理完之后把oldTable的此元素设置为forwarding
- 其他线程在put的时候发现了forwarding,参与到扩容中来,向后查看,查看到第一个不是forwarding的非null元素,执行上一步同样的操作
size一类的方法
在多线程中,size可以说根本无法准确判断元素个数,这种方法实际上是没意义的,只能看一个预估值