ConcurrentHashMap

读为什么不要加锁?
统计数量?
写加锁?
扩容流程?
https://blog.csdn.net/hao4954...
https://blog.csdn.net/lxsxkf/...

链表超过8就会转化为红黑树

扩容因子0.75

分段计数,用一个cell数组和一个base,在put/remove数据的时候,冲突不严重的时候,就cas操作base,失败了随机选择一个cell操作计数,在失败了就会扩容cell数组。统计的时候把所有的cell累加。

读不加锁:1:当桶是列表的时候,采用的是尾插法,所以能够遍历到新插入的节点。

     2:如果是扩容过程中,如果此节点没有迁移或没有迁移完成,那么寻找节点会去以前的桶找,如果此节点迁移完成了,会标志为fwd节点,fwd节点含有新的nextTable。保证整个map迁移过程中,读够读到。
     3:如果是插入到树中,树需要调整。红黑树中有一把读写锁,调整树需要获取写锁。如果读获取锁失败,会按照链表的方式循环寻找节点。如果循环过程中树调整完了,又会按照红黑树的方式查找。

put数据:会对对应桶加sync锁。如果节点是pwd,说明map在扩容,会协助扩容。如果是插入红黑树,还需要加读写锁的写锁。

你可能感兴趣的:(java)