concurrentHashMap 1.8原理

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可以说根本无法准确判断元素个数,这种方法实际上是没意义的,只能看一个预估值

猜你喜欢

转载自blog.csdn.net/quinnnorris/article/details/81044648