关于java:ConcurrentHashMap

53次阅读

共计 504 个字符,预计需要花费 2 分钟才能阅读完成。

读为什么不要加锁?
统计数量?
写加锁?
扩容流程?
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 在扩容,会帮助扩容。如果是插入红黑树,还须要加读写锁的写锁。

正文完
 0